如何在Python中按创建日期获取目录列表?
在Windows电脑上,使用Python获取一个文件夹里所有文件的列表,并按日期(创建日期或修改日期)排序,最好的方法是什么?
19 个回答
44
有一个叫做 os.path.getmtime
的函数,它可以告诉你自从计算机时代开始(也就是1970年1月1日)以来经过了多少秒。这个函数通常比 os.stat
要快。
import os
os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
203
我之前做过一个Python脚本,用来找出一个文件夹里最后更新的文件:
import glob
import os
search_dir = "/mydir/"
# remove anything from the list that is not a file (directories, symlinks)
# thanks to J.F. Sebastion for pointing out that the requirement was a list
# of files (presumably not including directories)
files = list(filter(os.path.isfile, glob.glob(search_dir + "*")))
files.sort(key=lambda x: os.path.getmtime(x))
这个代码应该可以满足你根据文件最后修改时间来查找的需求。
补充说明:如果你想的话,也可以用os.listdir()来代替glob.glob()。我最开始用glob的原因是我只想找特定类型的文件,而glob()在这方面更合适。如果用listdir的话,代码看起来会是这样的:
import os
search_dir = "/mydir/"
os.chdir(search_dir)
files = filter(os.path.isfile, os.listdir(search_dir))
files = [os.path.join(search_dir, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))
189
更新: 在Python 3中,按修改日期对dirpath
的条目进行排序:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(把@Pygirl的回答放在这里,以便更好地看到)
如果你已经有一个文件名的列表files
,那么在Windows上按创建时间对它进行就地排序(确保这个列表包含绝对路径):
files.sort(key=os.path.getctime)
你可以使用glob
来获取文件列表,比如在@Jay的回答中展示的那样。
旧回答
这是@Greg Hewgill
的回答的更详细版本。它最符合问题的要求。它区分了创建日期和修改日期(至少在Windows上是这样)。
#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time
# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date
# but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date
for cdate, path in sorted(entries):
print time.ctime(cdate), os.path.basename(path)
示例:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py