Python从列表中获取最新文件

Python从列表中获取最新文件,python,Python,我有这样一个文件列表: my_list=['l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt','PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt'] final_list= ['PPT_6_202008070522HLC.txt', 'PPT_12_202008070522HLC.txt', 'l.txt'] 我想有一个最新的文件列表,以ppt_6和ppt

我有这样一个文件列表:

my_list=['l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt','PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt']
final_list=
['PPT_6_202008070522HLC.txt', 'PPT_12_202008070522HLC.txt', 'l.txt']
我想有一个最新的文件列表,以ppt_6和ppt_12开头,并保留其他元素项,如下所示:

my_list=['l.txt','PPT_6_202008062343HLC.txt','PPT_6_202008070522HLC.txt','PPT_12_202008062343HLC.txt','PPT_12_202008070522HLC.txt']
final_list=
['PPT_6_202008070522HLC.txt', 'PPT_12_202008070522HLC.txt', 'l.txt']
现在我正在这样做:

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
从日期时间导入日期时间
now=datetime.now()
新的_弧=[]
时间_6=[]
时间_12=[]
对于我的_列表中的i:
如果我[4:5]=“6”:
时间_6.追加(i)
以利夫一书[4:5]=“1”:
时间_12.追加(i)
其他:
新弧追加(一)
time_6=[最大值(t表示时间为t,如果是datetime.strtime(t[-15:-3],“%Y%m%d%H%m”)

有更好的方法吗?

我能想到的最好办法是:

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))


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

我能想到的最好办法是:

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))


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

由于文件名已经有了日期顺序,您可以简单地对它们进行排序。然后按前缀分组(
PPT_6
PPT_12
)。最后从每组中选出第一行

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])

由于文件名已经有了日期顺序,您可以简单地对它们进行排序。然后按前缀分组(
PPT_6
PPT_12
)。最后从每组中选出第一行

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])

这些文件名中的datetime格式允许您不使用datetime函数,字母顺序就足够了

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

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)

这些文件名中的datetime格式允许您不使用datetime函数,字母顺序就足够了

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

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)

你试图用
PPT_6
PPT_12
获取最新文件,其余的保持原样?你试图用
PPT_6
PPT_12
获取最新文件,其余的保持原样?我得到了
名称错误:名称“re”没有定义
re
是一个标准库正则表达式的python包。你必须导入它。我在上面的代码段中添加了import语句。我得到了
NameError:name're'未定义
re
是正则表达式的标准库python包。你必须导入它。我在上面的代码段中添加了import语句。可以,但文件并不总是sorted@LuisMedina“并非总是对文件进行排序”这正是我使用
sorted()
的原因。同样,使用
groupby()
您不必事先知道
PPT_6
PPT_12
。这没关系,但文件并不总是sorted@LuisMedina“并非总是对文件进行排序”这正是我使用
sorted()
的原因。同样,使用
groupby()
您不必事先知道
PPT_6
PPT_12