如何迭代文件夹,但只检索文件的最新版本?

2024-09-30 20:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个每天更新的文件夹,每个文件都有一个新版本,遵循这个命名方案['AA_06182020','AA_06202020','BTT_06182020','BTT_06202020','DC_06182020','HOO_06182020','HOO_06202020']。文件名中的06182020是文件的日期(mm/dd/yyyy),是较新的日期,显然是文件的较新版本。现在我有一个脚本(每天运行),它迭代文件夹中的每个文件,但我希望得到它,以便只使用每个文件的最新版本。到目前为止,我已经能够检索所有文件的列表,然后将名称的日期部分解析为日期时间对象,并将其附加到新列表中。我不确定如何从这里开始,使列表按日期排序,只选择每个文件的最新版本进行进一步处理

from pathlib import Path
import pandas as pd 
import re
from datetime import datetime

me_data = (r"Path To Folder")
pathlist = Path(me_data).glob('**/*.xlsx')
fyl = []
new_fyls = []
for path in pathlist:
    # because path is object not string
    path_in_str = str(path)
    fyl.append(path.stem)
for entry in fyl:
    typ, date1 = entry.split('_')
    dt = datetime.strptime(date1,'%m%d%Y')
    new_fyls.append((entry, dt)) 

Tags: 文件pathinfromimport版本文件夹列表
2条回答

我建议你用字典修改一下你的第二个循环。您可以使用文件名类型,这样只保留一个日期(加上方便使用的文件名)。当您在循环中遇到一个新的日期时,您将与该文件的上一个日期进行比较,并存储最近的日期

files = {}  # the dictionary
for entry in fyl:
    typ, date1 = entry.split('_')
    dt = datetime.strptime(date1, '%m%d%Y')
    if typ not in files or files[typ][0] < dt:  # datetime supports comparison 
        files[typ] = (dt, entry)

在if语句中typ not in files检查循环中是否第一次遇到新文件。而另一个条件则需要更新

最后,获取最新的文件名,您需要获取存储的所有值,并每次保留第二个属性

 new_fyls = [row[1] for row in files.values()]

使用您的示例生成['AA_06202020', 'BTT_06202020', 'DC_06202020', 'HOO_06202020']

您可以尝试使用lambda函数进行排序,如下所示:

from datetime import datetime

files = ['AA_06182020', 'AA_06202020', 'BTT_06182020', 'BTT_06202020', 'DC_06182020', 'DC_06202020', 'HOO_06182020', 'HOO_06202020']
sorted_files = sorted(files, key=lambda x: datetime.strptime(x.split('_')[1], '%m%d%Y'), reverse=True)

这将首先生成一个带有最新文件的排序files列表(根据您的命名约定)

相关问题 更多 >