繁体   English   中英

在目录中返回特定格式的最新文件

[英]returning latest file in directory for specific format

我有一个目录,其格式为:

test_report-01-13-2014.11_53-en.zip
test_report-12-04-2013.11_53-en.zip

我需要根据文件名中的日期而不是上次触摸文件的日期返回最后的文件。 如果我这样做,我最终可能会使用2013文件,这是错误的。 我正在做以下事情,但它不起作用。 我通过以下参数:

mypath = "C:\\temp\\test\\"
mypattern = "test_report-%m-%d-%Y*"
myfile = getLatestFile(mypath, mypattern)

def getLatestFile(path="./", pattern="*"):
   fformat= path + pattern
   archives = glob.glob(fformat)

   if len(archives) > 0:
       return archives[-1]
   else:
       return None

任何想法可能是问题的原因?

glob以任意顺序返回匹配路径 ,并且它不理解%m-%d-%Y (它不是那么聪明)。

您需要读取路径列表,提取文件名,然后从文件名中获取日期。 这将是您用于对文件列表进行排序的关键。

这是一种方法:

import glob
import os
import datetime

def sorter(path):
    filename = os.path.basename(path)
    return datetime.datetime.strptime(filename[12:22], '%m-%d-%Y')

pattern = "test_report-*"
search_path = r'C:\temp\test\' # or 'c:/temp/test/'

file_list = glob.glob(pattern+search_path)

# Order by the date
ordered_list = sorted(file_list, key=sorter, reverse=True)

os.path.basename是一个返回路径最后一个组件的函数; 因为glob将返回完整路径,所以最后一个组件将是文件名。

由于您的文件名具有固定格式 - 而不是使用正则表达式,我只是通过切片文件名来获取日期部分,并将其转换为日期时间对象。

最后, sorted 返回 sort的结果(正常sort方法是一个就地排序)。 关键功能是提取日期并返回它, reverse=True需要以最新的顺序获取返回的列表。

您可以通过将glob.glob的结果直接传递给sorted来缩短代码:

ordered_list = sorted(glob.glob(pattern+search_path), key=sorter, reverse=True)

要将它与您编写的功能结合起来:

import glob, os, datetime

def sorter(path):
    filename = os.path.basename(path)
    return datetime.datetime.strptime(filename[12:22], '%m-%d-%Y')

def getLatestFile(path="./", pattern="*"):
   fformat = path + pattern
   archives = glob.glob(fformat)

   if len(archives):
      return sorted(archives, key=sorter, reverse=True)[0]

档案的顺序是任意的,但不仅仅是你的文件名不能按字母顺序排序(月份来自年份之前)。 最简单的方法是使用从文件名中提取datetime对象的key函数sort列表进行sort

import datetime

def getDateFromFilename(filename):
    try:
        return datetime.datetime.strptime(timestamp[12:-7], '%m-%d-%Y.%H_%M')
    except ValueError:
        return -1

archives.sort(key=getDateFromFilename)

请参阅Python 文档

os.listdir(path='.')

返回一个列表,其中包含path给出的目录中的条目名称。 该列表按任意顺序排列 ,不包括特殊条目'。' 和'..'即使它们存在于目录中。

因此,您必须使用更严格的过滤器或订购返回的列表。

如果您想按名称对列表进行排序,只需进行sorted(archives = glob.glob(fformat))

非常感谢您的投入。 我使用了一些东西并最终得到了这个,这对我的目的很好。

def getDateFromFilename(filename):
    try:
        return datetime.datetime.strptime(filename, myPattern + '%m-%d-%Y.%H_%M-en.zip')
    except ValueError:
        return -1

def getLatestFile(path, pattern):
    files = sorted([f for f in os.listdir(myPath) if f.startswith(pattern)])
    files.sort(key=getDateFromFilename)

    if len(files) > 0:
        return files[-1]
    else:
        return  None

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM