我与格式文件的目录:
test_report-01-13-2014.11_53-en.zip
test_report-12-04-2013.11_53-en.zip
我需要返回基于文件名不是文件的最后日期触及日的最后文件。 如果我这样做,我可以与2013文件,而不是,这将是错误的结束。 我做以下,但它不工作。 我传递在以下PARAMATERS:
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
会返回的完整路径,最后一个组件是文件名。
当你的文件名有一个固定的格式 - 而不是用正则表达式摆弄我只是切片文件名抓起日期部分,并将其转换为datetime对象。
最后, sorted
返回排序的结果(正常sort
方法是一种在适当位置的排序)。 关键功能就是提取的日期并返回, reverse=True
需要得到返回列表中的最新的第一顺序。
你可以通过传递的结果,缩短了代码位glob.glob
直接排序:
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]
档案的顺序是任意的,但不是唯一的,你的文件名不能按字母顺序排序(月来前一年)。 最简单的方法就是sort
列表用key
提取功能datetime
从文件名对象:
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='.')
返回包含在由路径给出的目录中的条目名称的列表。 这份名单是在任意次序 ,不包括特殊项目“” 和“..”,即使他们出现在目录中。
所以,你必须使用一个更严格的过滤器或命令返回的列表。
非常感谢输入。 我用一切一点点,结束了这一点,这工作得很好,我的目的。
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
如果您想排序的名字列表,只是sorted(archives = glob.glob(fformat))