提问人:Marc B. Hankin 提问时间:6/4/2011 最后编辑:Martijn PietersMarc B. Hankin 更新时间:6/5/2011 访问量:7550
如何按时间顺序列出文件,并注明文件修改日期
How to make a chronological list of files, with the file modification date
问:
我想在扩展名为 .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))
但是我不知道如何在列表中的文件名中附加“日期”。
任何建议将不胜感激。
答:
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]
要反转排序顺序,请在执行中使用可选参数:reverse
sort
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
当然,请参阅问题的最后一部分,我添加了您可能需要的内容。如果我的回答有帮助,请投票并接受;)
评论
key=lambda x: os.path.getmtime(x)
->key=os.path.getmtime