You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python归档超过30天的旧文件夹?当前仅支持单文件归档

实现归档/清理超过30天的旧文件夹

针对你原来只能处理单个归档文件的代码,我改写成了批量处理过期文件夹的版本,直接用文件夹的实际修改/创建时间判断,比从文件名提取日期靠谱得多。

修改后的完整代码

import os
import shutil
from datetime import datetime, timedelta

# 配置参数,自行替换路径和天数
target_folder = 'PATH'          # 要处理的目标文件夹路径
archive_folder = 'ARCHIVE_PATH' # 归档文件夹路径,会自动创建
archive_period_days = 30        # 超过此天数的文件夹将被归档

# 确保归档文件夹存在,不存在则自动创建
os.makedirs(archive_folder, exist_ok=True)

# 计算时间阈值:当前时间往前推30天
threshold_time = datetime.now() - timedelta(days=archive_period_days)

# 高效遍历目标文件夹内的所有条目
with os.scandir(target_folder) as entries:
    for entry in entries:
        # 仅处理文件夹,跳过文件
        if entry.is_dir(follow_symlinks=False):
            try:
                # 获取文件夹最后修改时间(需用创建时间则替换为entry.stat().st_ctime)
                folder_mod_time = datetime.fromtimestamp(entry.stat().st_mtime)
                
                # 判断是否超过归档周期
                if folder_mod_time < threshold_time:
                    src_path = entry.path
                    dest_path = os.path.join(archive_folder, entry.name)
                    
                    # 移动文件夹到归档目录(如需直接删除,替换为shutil.rmtree(src_path))
                    shutil.move(src_path, dest_path)
                    print(f"已归档:{src_path} → {dest_path}")
            except Exception as e:
                print(f"处理文件夹 {entry.name} 时出错:{str(e)}")

关键说明

  1. 高效遍历:用os.scandir替代os.listdir,无需额外调用os.stat获取文件属性,速度更快
  2. 时间判断:依赖系统记录的文件夹修改时间(st_mtime),比从文件名拆分日期更准确——毕竟文件名可手动修改,系统时间不会随意变动
  3. 归档/删除可选:代码默认将过期文件夹移动到归档目录,若无需保留归档,直接把shutil.move替换为shutil.rmtree(src_path)即可(注意:rmtree会彻底删除文件夹及内部所有内容,操作前请确认)
  4. 异常防护:加入try-except捕获错误,避免因权限不足、文件夹被占用等问题导致程序崩溃

顺带修复原代码的问题

  • 原代码未定义dir变量,已替换为配置的folder路径
  • 原用split('.')拆分文件名,碰到含.的文件名会报错,现在直接针对文件夹处理无需拆分
  • 原正则仅匹配.txt文件,完全不适用于文件夹场景,现在直接通过is_dir判断目录类型

内容的提问来源于stack exchange,提问作者jun long

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:48:25