如何按时间顺序列出文件,并注明文件修改日期

How to make a chronological list of files, with the file modification date

提问人:Marc B. Hankin 提问时间:6/4/2011 最后编辑:Martijn PietersMarc B. Hankin 更新时间:6/5/2011 访问量:7550

问:

我想在扩展名为 .bas 且在 2011 年 6 月 1 日之后被修改的目录中的那些文件的列表。另外,我想知道如何选择让列表中的文件显示上次修改文件的日期和时间,例如“filename.bas 2011-06-04_AM.00.30”

我是python新手。我能够使用以下代码列出扩展名为 .bas 的文件,按日期排序:

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time, glob
search_dir = r"e:\test"
files = filter(os.path.isfile, glob.glob(search_dir + "\\*.bas"))
files.sort(key=lambda x: os.path.getmtime(x))

但是我不知道如何在列表中的文件名中附加“日期”。

任何建议将不胜感激。

python datetime 目录列表

评论

0赞 Jochen Ritzel 6/5/2011
key=lambda x: os.path.getmtime(x) -> key=os.path.getmtime

答:

4赞 Manuel Salvadores 6/4/2011 #1

在元组列表中收集文件和日期,并按日期元素对该列表进行排序。下面是示例代码,其中的注释应该足以理解它:

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time, glob
search_dir = r"e:\test"
files = filter(os.path.isfile, glob.glob(search_dir + "\\*.bas"))
file_date_tuple_list = []
for x in files:
    d = os.path.getmtime(x)
    #tuple with file and date, add it in a list
    file_date_tuple = (x,d)
    file_date_tuple_list.append(file_date_tuple)
#sort the tuple list by the second element which is the date
file_date_tuple_list.sort(key=lambda x: x[1])

或者,您可以使用列表推导器使代码更加紧凑和干净......

file_date_tuple_list = [(x,os.path.getmtime(x)) for x in files]
file_date_tuple_list.sort(key=lambda x: x[1])

这两条线将替换第一个示例中的所有循环。for

现在,如果您想要列表中的内容是文件名和日期格式的字符串,那么......添加此导入...

from datetime import date

以及带有此列表推导式的另一行,它采用修改时间戳并将其格式化为字符串。

file_date_string_list = ["%s %s"%(x[0],date.fromtimestamp(x[1])) \
                                             for x in file_date_tuple_list]

要反转排序顺序,请在执行中使用可选参数:reversesort

file_date_tuple_list.sort(key=lambda x: x[1],reverse=True)

用于将日期限制为特定datetime

from datetime import datetime
limit = datetime(2011,01,05,17,0,0) #5pm , Jun 5 2011 
file_date_string_list = ["%s %s"%(x[0],date.fromtimestamp(x[1])) \
                                       for x in file_date_tuple_list \
                                       if datetime.fromtimestamp(x[1]) > limit ]

正如你所看到的,你可以在列表推导中添加一个条件,这真的很酷。if

评论

0赞 Marc B. Hankin 6/5/2011
谢谢。这真是太有帮助了。向我展示如何修改它以使最新的文件排在最前面,并且只有(例如)6 月 1 日下午 5 点之后的文件才会出现在file_date_string_list中,会不会太麻烦了?再次感谢你。
1赞 Manuel Salvadores 6/5/2011
当然,请参阅问题的最后一部分,我添加了您可能需要的内容。如果我的回答有帮助,请投票并接受;)