我有一个.xlsx
文件名列表,这些文件名的末尾附有日期,例如JAK_--_USA_2019-01-07.xlsx
。列表中有多个这些文件名,但是我只需要在文件名后附加最新日期即可。因此,我可以有一个文件JAK_--_USA_2019-01-07.xlsx
,然后在列表中还有一个文件名JAK_--_USA_2019-01-08.xlsx
。我只想要具有最新日期的文件名。我想从列表中删除任何其他内容。
以下是我正在使用的文件的简短列表:
files = ['JAK_--_USA_2019-01-07.xlsx','JAK_--_USA_2019-01-08.xlsx','DAG_-
-_USA_2019-01-31.xlsx','DAG_--_USA_2019-06-01.xlsx']
到目前为止,我尝试创建的正则表达式将日期和文件的开头部分分成单独的列表(“ matches”和“ dates”)。正则表达式可以正常工作,可以将文件一分为二。之后,我迷失了如何仅获取所需文件的方法。我什至不知道正则表达式是否正确。我将列表按降序排列,因为它将把该组文件的最新日期放在文件序列的开头。
files = ['JAK_--_USA_2019-01-07.xlsx','JAK_--_USA_2019-01-08.xlsx','DAG_-
-_USA_2019-01-31.xlsx','DAG_--_USA_2019-06-01.xlsx']
files.sort(reverse=True)
matches = []
dates = []
for file in files:
match = re.search(r'([a-zA-Z0-9]+)(\_([a-zA-Z0-9\-]*|--))(\_[a-zA-
Z]*)* (\_[a-zA-Z]+_)(\d{4}-\d{2}-\d{2})', file)
date = re.search(r'\d{4}-\d{2}-\d{2}',file)
matches.append(match.group(0))
dates.append(date.group(0))
我希望只有两个文件的列表具有最接近的日期。见下文:
new_list = ['JAK_--_USA_2019-01-08.xlsx','DAG_--_USA_2019-06-01.xlsx']
答案 0 :(得分:0)
由于文件名结构看起来很稳定,我建议您采用一种简单的解析方法。
类似的东西:
files = ['JAK_--_USA_2019-01-07.xlsx','JAK_--_USA_2019-01-08.xlsx','DAG_--_USA_2019-01-31.xlsx','DAG_--_USA_2019-06-01.xlsx']
dates = [(name.split('_')[-1].split('.')[0], i) for i, name in enumerate(files)] # split filename as such since its consistent, record indices also
dates.sort(reverse=True)
# index into files to get full name, this should give you the most recent file
print files[dates[0][1]]
答案 1 :(得分:0)
您可以将日期字符串转换为datetime对象,并使用其属性对列表进行排序。
from datetime import datetime
def extract_date(file_name):
date_str = file_name[-15:-5]
return datetime.strptime(date_str, '%Y-%m-%d')
files = ['JAK_--_USA_2019-01-07.xlsx','JAK_--_USA_2019-01-08.xlsx','DAG_--_USA_2019-01-31.xlsx','DAG_--_USA_2019-06-01.xlsx']
print(sorted(files, key=extract_date))
对列表进行排序后,您可以提取您感兴趣的元素。
如果文件名格式与您提到的格式完全相同,则函数extract_date将起作用。如果不是,则可以在此函数中放置一些正则表达式代码,它也应该可以工作。