手把手教你编写按时间排序的脚本(附完整代码)
目录导读
- 为什么需要按时间排序本地文件?
- 核心逻辑拆解:排序脚本的底层原理
- 实战代码:Python脚本实现文件按时间排序(含注释)
- 进阶技巧:按修改时间、创建时间、访问时间分别排序
- 常见错误与优化方案
- 问答环节:解决你的排序脚本疑问
为什么需要按时间排序本地文件?
在日常工作中,我们常会遇到以下场景:

- 需要清理一周前的日志文件
- 要找到最近修改的配置文件
- 批量处理按时间顺序排列的图片或文档
手动通过文件资源管理器排序效率低,且无法自动化。编写一个按时间排序的脚本可以让你一键完成文件整理,尤其适合运维人员、数据分析师和前端开发者的文件管理工作。
核心逻辑拆解:排序脚本的底层原理
一个标准的文件排序脚本包含三个核心环节:
- 遍历目录:用
os.listdir()或glob.glob()获取文件列表 - 提取时间属性:通过
os.path.getmtime()获取修改时间(Modification Time)、getctime()获取创建时间(Creation Time,Windows下常用)、getatime()获取访问时间(Access Time) - 排序输出:使用Python的
sorted()函数,结合key参数传入时间函数
注意:在不同操作系统(Windows/Linux/macOS)中,文件时间属性的含义有细微差异,这一点我们在第4节详细讲解。
实战代码:Python脚本实现文件按时间排序(含注释)
以下是一个可直接运行的Python脚本,按修改时间降序排列当前目录下的所有文件:
import os
import glob
from datetime import datetime
def sort_files_by_time(directory=".", reverse=True):
"""
按修改时间排序指定目录下的文件
:param directory: 目标文件夹路径,默认当前目录
:param reverse: True=最新文件在前(倒序),False=最早文件在前
:return: 排序后的文件列表(包含路径)
"""
# 获取所有非隐藏文件(可根据需求修改模式)
files = [f for f in glob.glob(os.path.join(directory, "*")) if os.path.isfile(f)]
# 提取修改时间戳,并排序
sorted_files = sorted(
files,
key=lambda f: os.path.getmtime(f),
reverse=reverse
)
# 打印结果(包含可读时间)
print(f"{'文件名':<50} {'修改时间':<25}")
print("-" * 75)
for f in sorted_files:
mtime = os.path.getmtime(f)
readable_time = datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S')
print(f"{os.path.basename(f):<50} {readable_time:<25}")
return sorted_files
if __name__ == "__main__":
# 示例:排序当前目录下的文件
sort_files_by_time(directory="./downloads", reverse=True)
输出示例:
文件名 修改时间
---------------------------------------------------------------------------
report_2025.pdf 2025-03-15 09:12:34
backup.zip 2025-03-14 22:05:18
old_data.csv 2025-03-10 16:40:22
进阶技巧:按修改时间、创建时间、访问时间分别排序
不同业务场景需要不同的时间维度:
| 时间维度 | 函数 | 适用场景 |
|---|---|---|
| 修改时间 | os.path.getmtime() |
最后被修改的时间(最常用) |
| 创建时间 | os.path.getctime() |
在Windows上表示文件创建时间;在Unix上表示状态变更时间(谨慎使用) |
| 访问时间 | os.path.getatime() |
文件最后一次被读取的时间(性能代价高) |
跨平台最佳实践:在macOS/Linux上获取文件创建时间,可以使用os.stat().st_birthtime(macOS)或依赖第三方库cftime,建议始终以修改时间为默认排序依据。
常见错误与优化方案
问题1:运行时报错“FileNotFoundError”
原因:os.path.getmtime() 在读取到被删除的快捷方式或符号链接时可能报错
解决:增加异常处理:
try:
mtime = os.path.getmtime(f)
except OSError:
continue # 跳过无法访问的文件
问题2:脚本不递归子目录
优化:使用os.walk()实现递归遍历:
def sort_files_recursive(root_dir):
sorted_all = []
for dirpath, _, filenames in os.walk(root_dir):
for f in filenames:
full_path = os.path.join(dirpath, f)
sorted_all.append(full_path)
sorted_all.sort(key=lambda x: os.path.getmtime(x), reverse=True)
return sorted_all
问题3:大量文件时性能差
优化:对于超过10000个文件的目录,考虑用os.scandir()替代os.listdir(),它返回迭代器且包含文件属性信息,减少系统调用。
问答环节:解决你的排序脚本疑问
Q1:为什么我的脚本在Linux上按“创建时间”排序结果不对?
A:在Linux中,os.path.getctime()返回的是状态改变时间(比如权限、所有权修改),并非真正的创建时间,Linux原生不支持简单的文件创建时间读取,需要借助xfs或ext4文件系统的扩展属性,建议Linux下统一使用修改时间。
Q2:能否让脚本只显示最近7天的文件?
A:可以,在提取时间后增加过滤条件:
import time one_week_ago = time.time() - 7 * 24 * 3600 filtered = [f for f in sorted_files if os.path.getmtime(f) > one_week_ago]
Q3:我是否需要安装额外的库?
A:上述代码仅依赖Python标准库os、glob、datetime,无需安装第三方库,如果处理特殊文件(如视频、图片的元数据时间),才需要考虑pymediainfo或Pillow。
Q4:脚本可以直接删除旧文件吗?
A:安全起见,脚本只应输出排序结果,如需自动删除,请务必增加确认步骤,
if input("确认删除最早的文件?(y/n): ").lower() == 'y':
os.remove(oldest_file)
通过本文的实战代码和原理拆解,你应该已经掌握了按时间排序本地文件脚本的编写方法,从单目录排序扩展到递归遍历,再到异常处理与性能优化,这套逻辑可以无缝嵌入到你的文件清理工具链中,打开终端试试看吧!