按文件名中的日期顺序列出目录中的所有文件?

时间:2017-05-30 20:27:34

标签: python

我在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

3 个答案:

答案 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