如何在Python中按创建日期获取目录列表?

220 投票
19 回答
325619 浏览
提问于 2025-04-11 09:28

在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

撰写回答