网站首页/ 信息中心/ 档案百科/

Python脚本实现海量文件自动归档与重命名

发布时间:2026年09月05日 09:10:15 浏览量:0
Python脚本实现海量文件自动归档与重命名

一、环境准备与工具安装

在开始编写自动化脚本之前,必须确保本地计算机已经配置好Python运行环境。本指南基于Python 3.8+版本编写,兼容Windows、macOS及Linux系统。

1. 安装Python环境

访问Python官方下载页面 https://www.python.org/downloads/,下载对应操作系统的安装包。

安装完成后,打开终端(Windows按Win+R输入cmd,Mac打开Terminal),输入以下命令验证安装是否成功:

```bash python --version ```

2. 安装必要依赖库

本脚本主要依赖Python标准库(os, shutil, datetime),无需额外安装第三方库,确保环境纯净且零门槛。但在处理Excel元数据时可能用到openpyxl,此处我们专注于纯文件系统操作,保持无依赖状态。

二、场景定义与测试数据生成

为了确保脚本落地即用,我们设定一个典型的实战场景:你有一个包含数千个扫描件或发票的文件夹,文件名杂乱无章(如 "IMG_001.jpg", "扫描20231001.pdf")。我们需要根据文件名中的日期或文件类型,自动将其移动到按 "年份/月份" 分类的子文件夹中,并重命名为标准格式。

1. 创建测试目录结构

在D盘根目录下创建一个名为 file_archive_test 的文件夹。在终端中执行以下命令快速生成100个模拟的杂乱文件,用于后续测试脚本效果:

```bash Windows PowerShell 示命令 mkdir D:\file_archive_test cd D:\file_archive_test 1..100 | ForEach-Object { New-Item -ItemType File -Name ("Scan_{0:yyyyMMdd}_{1}.pdf" -f (Get-Date).AddDays(-$_), $_) } ```

三、核心代码逻辑详解

我们将编写一个名为 auto_archive.py 的脚本。该脚本将执行以下核心逻辑:

  1. 遍历源目录:识别所有待处理的文件。
  2. 提取元数据:从文件名中提取日期信息,若文件名无日期,则使用文件的最后修改时间。
  3. 生成新路径:构建 "年/月" 的目标文件夹结构。
  4. 重命名与移动:将文件移动至目标文件夹,并重命名为 "日期_原序号.后缀"。

1. 导入标准库

脚本头部需引入操作系统交互、路径处理及时间相关的标准库。

```python import os import shutil import time from datetime import datetime import re ```

2. 配置参数区

在脚本开头定义全局变量,方便用户根据实际情况修改源路径和目标路径。这里我们设定源目录和目标目录为同一目录下的不同子集,实际操作中建议将目标目录设为NAS或外接硬盘路径。

```python 配置区域:请根据实际情况修改路径 Windows路径示例:r"D:\file_archive_test" Mac/Linux路径示例:"/Users/username/Downloads/test" SOURCE_DIR = r"D:\file_archive_test" 是否启用模拟运行(True为只打印不移动,False为真实执行) DRY_RUN = True ```

3. 文件名解析函数

这是脚本的核心逻辑之一。我们需要编写一个正则表达式来匹配常见的日期格式(如20231001, 2023-10-01)。如果匹配失败,则回退到使用文件系统的时间戳。

```python def extract_date_from_filename(filename): """ 尝试从文件名中提取日期 支持格式:20231001, 2023-10-01, 2023/10/01 """ 定义正则匹配模式,匹配常见的日期连接符 pattern = re.compile(r"(\d{4})[-_/]?(\d{2})[-_/]?(\d{2})") match = pattern.search(filename) if match: year, month, day = match.groups() try: return datetime(int(year), int(month), int(day)) except ValueError: 如果日期不合法(如2月30日),返回None return None return None ```

4. 归档处理主函数

该函数负责遍历文件夹、计算目标路径并执行移动操作。注意处理文件名中的非法字符,防止移动失败。

```python def sanitize_filename(name): """ 移除文件名中Windows不支持的非法字符 """ illegal_chars = '<>:"/\|?' for char in illegal_chars: name = name.replace(char, '_') return name def process_files(): 检查源目录是否存在 if not os.path.exists(SOURCE_DIR): print(f"错误:源目录 {SOURCE_DIR} 不存在!") return files = [f for f in os.listdir(SOURCE_DIR) if os.path.isfile(os.path.join(SOURCE_DIR, f))] total_files = len(files) print(f"开始处理,共发现 {total_files} 个文件...") print(f"当前模式:{'模拟运行 (不移动文件)' if DRY_RUN else '真实执行'}") print("-" 50) count = 0 for filename in files: src_path = os.path.join(SOURCE_DIR, filename) 1. 获取文件日期 file_date = extract_date_from_filename(filename) 如果文件名没提取到日期,使用文件的修改时间 if not file_date: mod_time = os.path.getmtime(src_path) file_date = datetime.fromtimestamp(mod_time) 2. 构建目标目录结构:源目录/年份/月份 year_str = str(file_date.year) month_str = f"{file_date.month:02d}" 保持两位数,如 05 target_folder = os.path.join(SOURCE_DIR, year_str, month_str) 3. 构建新文件名:日期_原文件名 使用 sanitize_filename 清理原文件名中的特殊符号 clean_name = sanitize_filename(filename) new_filename = f"{file_date.strftime('%Y%m%d')}_{clean_name}" target_path = os.path.join(target_folder, new_filename) 4. 执行移动操作 try: 如果目标文件夹不存在,则创建 if not os.path.exists(target_folder): if DRY_RUN: print(f"[模拟] 创建目录: {target_folder}") else: os.makedirs(target_folder) 检查目标文件是否已存在,存在则追加序号 if os.path.exists(target_path) and src_path != target_path: base, ext = os.path.splitext(new_filename) counter = 1 while os.path.exists(os.path.join(target_folder, f"{base}_{counter}{ext}")): counter += 1 target_path = os.path.join(target_folder, f"{base}_{counter}{ext}") if DRY_RUN: print(f"[模拟] {filename} -> {target_path}") else: shutil.move(src_path, target_path) print(f"[成功] {filename} -> {target_path}") count += 1 except Exception as e: print(f"[失败] 处理 {filename} 时出错: {e}") print("-" 50) print(f"处理完成,共处理 {count}/{total_files} 个文件。") if __name__ == "__main__": process_files() ```

四、脚本使用与执行步骤

将上述代码完整复制,保存为 auto_archive.py 文件,放置在任意位置(建议不放在待处理的文件夹内,以免自己把自己移动了)。

1. 修改配置

Python脚本实现海量文件自动归档与重命名

用记事本或VS Code打开 auto_archive.py,找到 SOURCE_DIR 变量,修改为你实际的文件夹路径。

注意:Windows路径前务必加 r 字符(如 r"C:\Users\Name\Desktop\Files"),这表示原始字符串,避免反斜杠转义错误。

2. 模拟运行测试

第一次运行时,建议保持 DRY_RUN = True。这会模拟整个过程,只在屏幕打印移动路径,而不实际触碰文件。这是防止误操作导致文件混乱的关键安全步骤。

在终端中执行:

```bash python auto_archive.py ```

观察输出日志,确认路径解析是否正确,分类逻辑是否符合预期。

3. 正式执行

确认模拟运行无误后,修改脚本中 DRY_RUN = False。再次运行脚本,程序将开始真实地创建文件夹并移动文件。

对于大量文件(如数千个),Python的I/O操作非常高效,通常只需几秒钟即可完成。

五、进阶技巧与异常处理

在实操过程中,可能会遇到一些特殊情况,以下是针对性的解决方案。

1. 处理被占用的文件

如果某个文件正在被其他程序(如Word、PDF阅读器)打开,shutil.move 会抛出 PermissionError。在生产环境中,可以在代码中捕获该异常并记录到日志文件中,而不是直接让程序崩溃。

except Exception as e: 块中添加:

```python with open("error_log.txt", "a", encoding="utf-8") as f: f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - {filename} - {str(e)}\n") ```

2. 处理重复文件名冲突

上述代码已经包含了基础的重复检测逻辑(追加 _1, _2)。如果你希望覆盖旧文件而不是重命名,可以将移动逻辑修改为:

```python if os.path.exists(target_path): os.remove(target_path) 先删除旧文件 shutil.move(src_path, target_path) ```

3. 扩展:根据文件类型分类

如果你希望先按 "图片/文档" 分类,再按时间分类,可以在获取文件扩展名后增加一层目录逻辑。

```python 获取文件后缀并转小写 ext = os.path.splitext(filename)[1].lower() if ext in ['.jpg', '.png', '.jpeg']: type_folder = "图片" elif ext in ['.pdf', '.doc', '.docx', '.txt']: type_folder = "文档" else: type_folder = "其他" 更新目标路径逻辑 target_folder = os.path.join(SOURCE_DIR, type_folder, year_str, month_str) ```

六、总结

通过上述Python脚本,我们实现了一个完全自动化的文件归档系统。这套方案不依赖任何付费软件,逻辑透明且可无限定制。掌握这套方法后,你可以将其扩展为定时任务(Windows Task Scheduler或Crontab),每天自动处理下载文件夹中的新文件,实现真正的数字化办公自动化。

商标档案管理系统:别再让商标资产“睡大觉”了!
商标档案管理系统:别再让商标资产“睡大觉”了!
你有没有发现,很多公司花大价钱注册了一堆商标,结果呢?这些商标就像被扔进了仓库角落的旧文件,没人记得、没人维护,甚至快过期了都无人知晓。这事儿吧,说白了就是管理上的一笔“糊涂账”。
2026年09月05日 09:10:15
土木工程建筑业企业档案培训:实用干货全揭秘
土木工程建筑业企业档案培训:实用干货全揭秘
哎,各位土木届的搬砖人、包工头、资料员们,终于挖到个能救咱们半条命的宝贝了——今天要唠的就是跟咱们每天离不开的“工地隐形生命线”有关的【土木工程建筑业企业档案培训】!我可不是啥自媒体瞎忽悠,我是真踩过...
2026年09月05日 09:10:15
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818