[英]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)
如果您想按名称对列表进行排序,只需进行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.