首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python从列表中获取最新文件

Python从列表中获取最新文件
EN

Stack Overflow用户
提问于 2020-08-11 06:48:09
回答 3查看 77关注 0票数 0

我有一个文件列表,如下所示:

代码语言:javascript
运行
复制
my_list=['l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt','PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt']

我想要一个最终的列表,其中包含以ppt_6和ppt_12开头的最新文件,并保留其他元素项,如下所示:

代码语言:javascript
运行
复制
final_list=
['PPT_6_202008070522HLC.txt', 'PPT_12_202008070522HLC.txt', 'l.txt']

现在我正在做这件事:

代码语言:javascript
运行
复制
from datetime import datetime
now = datetime.now()

new_arc=[]
time_6=[]
time_12=[]
for i in my_list:
    if i[4:5]=='6':
        time_6.append(i)
    elif i[4:5]=='1':
        time_12.append(i)
    else:
        new_arc.append(i)

time_6 = [max(t for t in time_6 if datetime.strptime(t[-15:-3], '%Y%m%d%H%M') < now)]
time_12 = [max(t for t in time_12 if datetime.strptime(t[-15:-3], '%Y%m%d%H%M') < now)]

final_list=time_6+time_12+new_arc

有没有更好的方法来做这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-11 09:16:30

将datetime格式转换成这些文件名允许您不使用datetime函数,字母顺序就足够了。

您可以删除与这两个模式匹配的所有项,最后附加它们中的最新项,即最大(按字母顺序)的元素。

代码语言:javascript
运行
复制
p1 = [x for x in my_list if x.startswith("PPT_6")]
p2 = [x for x in my_list if x.startswith("PPT_12")]

result = [x for x in my_list if x not in p1 and x not in p2]
result.append(max(p1))
result.append(max(p2))

print(result)
票数 1
EN

Stack Overflow用户

发布于 2020-08-11 08:16:24

因为文件名已经有了日期顺序,所以您可以简单地对它们进行排序。然后按前缀(PPT_6PPT_12)分组。最后,从每一组中获得最上面的一行。

代码语言:javascript
运行
复制
from itertools import groupby

#get prefix up to nth _
def split_nth(text, n):
    grp = text.split('_')
    return '_'.join(grp[:n])

my_list =['l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt',
          'PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt']

sorted_list = sorted(my_list[1:], reverse=True)
groups = groupby(sorted_list, key=lambda x: split_nth(x, 2))
result = [next(v) for _, v in groups]
result.append(my_list[0])
票数 1
EN

Stack Overflow用户

发布于 2020-08-11 07:54:47

我能想到的最好的结果是:

代码语言:javascript
运行
复制
import re

my_list = [
    'l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt',
    'PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt'
]
patterns = (re.compile("PPT_6"), re.compile("PPT_12"))

final_list = [sorted(list(filter(pattern.match, problem_list)))[0] 
            for pattern in patterns]
final_list += list(filter(re.compile("[^PPT]").match, problem_list))

根据您将要处理的文件名的数量,我认为这应该不会太糟糕。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63349058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档