在目录中返回最新的文件的具体格式(returning latest file in director

2019-10-19 05:41发布

我与格式文件的目录:

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

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

Answer 1:

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]


Answer 2:

档案的顺序是任意的,但不是唯一的,你的文件名不能按字母顺序排序(月来前一年)。 最简单的方法就是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)


Answer 3:

见Python的 文档 :

os.listdir(path='.')

返回包含在由路径给出的目录中的条目名称的列表。 这份名单是在任意次序 ,不包括特殊项目“” 和“..”,即使他们出现在目录中。

所以,你必须使用一个更严格的过滤器或命令返回的列表。



Answer 4:

非常感谢输入。 我用一切一点点,结束了这一点,这工作得很好,我的目的。

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


Answer 5:

如果您想排序的名字列表,只是sorted(archives = glob.glob(fformat))



文章来源: returning latest file in directory for specific format
标签: python glob