Python 批量按修改日期归档文件:按月分文件夹整理
用 Python 读取文件修改时间,把文件自动归档到「2024-01」「2024-02」这样的年月文件夹,适合整理聊天记录、下载文件、日志、照片。
场景痛点
下载目录、聊天接收文件夹、服务器日志堆积几个月,文件名看不出时间,想按「哪个月的东西放哪个月」整理,手动看属性、改路径、建文件夹,几个文件就半小时。用 Python 读文件的修改时间 mtime,自动按「年-月」建文件夹,把文件搬进去,找历史资料直接进对应月份。
用到的库
纯标准库,无需 pip 安装:
# os、shutil、datetime 为标准库
完整代码
import os
import shutil
from datetime import datetime
# ========== 配置区 ==========
SOURCE_DIR = "./聊天记录下载" # 要整理的文件夹
DEST_ROOT = "./按月归档" # 归档根目录
GRANULARITY = "month" # month=按年-月, day=按年-月-日
DRY_RUN = True
# ============================
def format_date(ts: float) -> str:
"""把时间戳格式化成文件夹名。"""
dt = datetime.fromtimestamp(ts)
if GRANULARITY == "day":
return dt.strftime("%Y-%m-%d")
return dt.strftime("%Y-%m")
def main():
if not os.path.isdir(SOURCE_DIR):
print(f"目录不存在:{SOURCE_DIR}")
return
count = 0
for name in os.listdir(SOURCE_DIR):
src_path = os.path.join(SOURCE_DIR, name)
if not os.path.isfile(src_path):
continue
# 读文件修改时间
mtime = os.path.getmtime(src_path)
folder = format_date(mtime)
dest_dir = os.path.join(DEST_ROOT, folder)
dest_path = os.path.join(dest_dir, name)
# 重名加后缀
if os.path.exists(dest_path):
stem, e = os.path.splitext(name)
dest_path = os.path.join(dest_dir, f"{stem}_{folder}{e}")
print(f"[{'预览' if DRY_RUN else '归档'}] {name} -> {folder}/")
if not DRY_RUN:
os.makedirs(dest_dir, exist_ok=True)
shutil.move(src_path, dest_path)
count += 1
print(f"\n共归档 {count} 个文件(DRY_RUN={DRY_RUN})")
if __name__ == "__main__":
main()
代码讲解
- os.path.getmtime:返回文件最后修改时间的时间戳(从 1970 年起的秒数)。用它而不是创建时间,因为跨设备拷贝后创建时间常被重置,修改时间更可靠。
- datetime.fromtimestamp:把时间戳转成本地时间,再用
strftime格式化成2024-03这种文件夹名。 - GRANULARITY 开关:想按天归档就设成
day,生成2024-03-15这种目录;按年归档就改成%Y。改一个值就行。 - 归档到单独目录:DEST_ROOT 和 SOURCE_DIR 分开,原文件夹整理完空了,归档盘按月排好,不会混。
运行结果
终端打印 合同.pdf -> 2024-03/。预览确认每个文件归到的月份对得上(挑几个文件在资源管理器里核对修改时间),把 DRY_RUN 改成 False,DEST_ROOT 下就生成 2024-01、2024-02 这样的月份目录,文件按月归位。
注意事项
- 修改时间可能不准:从 U 盘、网盘、微信接收的文件,修改时间可能是接收时间而非原始时间。重要归档前抽几个核对。
- 别按创建时间:Windows 的创建时间在文件复制后会变成复制时刻,不如修改时间稳定。
- 跨时区:
fromtimestamp用本地时区,服务器在国外部署时注意时区设置。 - 重名处理:同月内同名文件会加日期后缀,不会互相覆盖。
- 先 dry-run 抽查:挑两三个文件对照一下系统属性里的修改时间,确认脚本读对了再批量跑。

更新时间:2026-09-14 21:31:23
上一篇:Python批量修改文件后缀扩展名:一键重命名所有文件类型