我在Desktop文件夹(Ubuntu)中有各种tar文件。
文件名是这样的:
esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-**05222017**-4.tar
粗体部分是日期。我想按日期顺序对文件进行排序,最近一次。
是否有一个简单的python解决方案?
import glob
import datetime
import re
timeformat = "%m%d%Y"
regex = re.compile("^esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-(\d*\d*)")
def gettimestamp(thestring):
m = regex.search(thestring)
return datetime.datetime.strptime(m.groups()[0], timeformat)
list_of_filenames = ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4','esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4']
for fn in sorted(list_of_filenames, key=gettimestamp):
print fn
答案 0 :(得分:1)
不,没有简单的 Python函数。但是,有一些相当简单的构建块,您可以从中构建可读的解决方案。
编写一个函数来提取日期并重新排列它以用作排序键。找到文件名中的最后两个连字符,抓取它们之间的字符串,然后以yyyymmdd(年 - 月 - 日)格式重新排列数字。返回该字符串或整数(将起作用)作为功能值。
对于您的主例程,收集列表中的所有文件名(或生成一个生成器)并使用该函数的值作为排序键对它们进行排序。
有关实施的详细信息,请参阅sorting wiki。
答案 1 :(得分:1)
正如亚当·斯密指出的那样,你需要使用文件列表。
import glob, os
import datetime
import re
timeformat = "%m%d%Y"
regex = re.compile("(\d*\d*)-\d*.tar")
def gettimestamp(thestring):
m = regex.search(thestring[-14:-1])
if m:
return datetime.datetime.strptime(m.groups()[0], timeformat)
else:
return None
list_of_filenames = os.listdir('/home/james/Desktop/tarfolder')
for fn in sorted(list_of_filenames, key=gettimestamp):
print fn
编辑正如Martineu注意到的那样,哈希值可能与您指定的哈希值不同,因此更容易提前丢弃名称部分的开头。
答案 2 :(得分:0)
您无需解析日期,甚至无需使用正则表达式。如果文件名的结构与你说的一样,那就足够了:
filenames = ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4',
'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4',
'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-bad_date-4',]
def parse_date(name, offset=-10):
try:
date_str = name[offset:offset+8]
return int(date_str[-4:] + date_str[:2] + date_str[2:4])
except (IndexError, TypeError, ValueError): # invalid file name
return -1
sorted_list = [x[1] for x in sorted((parse_date(l), l) for l in filenames) if x[0] != -1]
# ['esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05202017-4',
# 'esarchive--James-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05212017-4']
UPDATE - 我添加了offset参数,以指定文件名中的日期开始位置。在您发布的列表中,它从后面开始10个字符(默认),但如果您在名称后面有.tar
个扩展名,就像在初始示例中一样,您也会将这4个字符记入帐户并使用-14的<{1}}:
offset