一、场景背景与需求分析
在档案整理与评审工作中,最核心的痛点在于面对海量的非结构化文件(如合同、扫描件、照片等),文件命名不规范、存储分散,且评审方通常要求提供一份包含“序号、文件名、归档日期、文件路径”的Excel目录清单。人工手动重命名、移动文件并录入Excel,不仅效率极低,且极易出错。
本指南将提供一套基于Python的零门槛自动化解决方案。该方案能够一键批量重命名文件、按日期自动分类归档,并自动生成符合评审要求的Excel目录清单。你无需具备深厚的编程基础,只需按照本文步骤操作即可。
二、环境准备与依赖安装
在开始编写脚本之前,需要确保你的电脑上已经配置好了Python运行环境。Python是跨平台的,Windows、Mac和Linux均适用。
1. 安装Python环境
如果尚未安装,请访问Python官网下载安装包。
下载地址:https://www.python.org/downloads/
下载对应操作系统的安装包(推荐Python 3.9及以上版本)。安装时,务必勾选“Add Python to PATH”选项,这一步至关重要,否则后续命令无法在终端直接运行。安装完成后,在终端(Win键+R输入cmd)输入 python --version,显示版本号即表示安装成功。
2. 安装必要的第三方库
我们需要处理Excel文件和系统路径,因此需要安装 pandas 和 openpyxl 这两个库。打开终端(命令行),执行以下命令:
```bash
pip install pandas openpyxl
```
如果下载速度较慢,可以使用国内镜像源:
```bash
pip install pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
```
三、目录结构规划
为了保证脚本运行无误,请先在D盘根目录下(或任意位置)创建一个名为 archive_project 的文件夹,并在其中建立以下结构:
- source_folder/:存放待整理的原始混乱文件(请放入一些测试文件,如“扫描件1.pdf”、“2023合同.jpg”等)。
- target_folder/:空文件夹,脚本将自动把整理好的文件存放到此处。
- organize.py:我们将要创建的Python脚本文件。
四、核心代码实现与逻辑解析
我们将编写一个完整的Python脚本。该脚本的主要逻辑包含三个部分:
- 文件遍历与解析:读取源文件夹下的所有文件。
- 重命名与归档:根据当前时间戳和文件类型,生成规范的文件名,并移动到目标文件夹。
- 生成清单:将处理结果记录到内存中,最后统一导出为Excel。
1. 脚本配置与导入模块
我们需要导入操作系统相关的库和数据处理库。请创建 organize.py 文件并输入以下代码:
```python
import os
import shutil
import pandas as pd
from datetime import datetime
配置区域
源文件夹路径:存放待整理文件的路径
SOURCE_DIR = r'D:\archive_project\source_folder'
目标文件夹路径:整理后文件的存放路径
TARGET_DIR = r'D:\archive_project\target_folder'
Excel清单输出路径
OUTPUT_EXCEL = r'D:\archive_project\归档目录清单.xlsx'
档案前缀,用于评审时的批次标识
ARCHIVE_PREFIX = "2023年度评审_"
```
注意:路径前的 r 表示原始字符串,用于处理Windows路径中的反斜杠,防止转义错误。请务必将上述路径修改为你电脑上实际创建的路径。
2. 文件解析与重命名逻辑
接下来是核心处理函数。我们将定义一个函数来处理单个文件。为了满足评审要求,我们将文件名格式化为:前缀_日期_序号_原扩展名。
```python
def process_files():
检查目标文件夹是否存在,不存在则创建
if not os.path.exists(TARGET_DIR):
os.makedirs(TARGET_DIR)
file_records = []
获取当前日期字符串,例如 20231027
current_date_str = datetime.now().strftime("%Y%m%d")
遍历源文件夹
files = os.listdir(SOURCE_DIR)
按文件名排序,确保序号有序
files.sort()
for index, filename in enumerate(files):
source_path = os.path.join(SOURCE_DIR, filename)
跳过文件夹,只处理文件
if not os.path.isfile(source_path):
continue
获取文件扩展名
file_ext = os.path.splitext(filename)[1]
构建新文件名:前缀 + 日期 + 3位序号 + 扩展名
例如:2023年度评审_20231027_001.pdf
new_filename = f"{ARCHIVE_PREFIX}{current_date_str}_{str(index+1).zfill(3)}{file_ext}"
target_path = os.path.join(TARGET_DIR, new_filename)
try:
移动文件
shutil.move(source_path, target_path)
记录归档信息用于生成Excel
file_records.append({
"序号": index + 1,
"原文件名": filename,
"归档文件名": new_filename,
"归档日期": current_date_str,
"文件类型": file_ext[1:].upper(), 去掉点并转大写
"存储路径": target_path
})
print(f"成功处理: {filename} -> {new_filename}")
except Exception as e:
print(f"处理文件 {filename} 失败: {e}")
return file_records
```
代码细节解析:
os.path.join:自动拼接路径,兼容不同操作系统。
str(index+1).zfill(3):将序号格式化为3位数,如1变成001,这在档案排序中非常重要。
shutil.move:实现文件的剪切移动操作,比复制更节省空间。
3. 自动生成档案目录清单

整理完文件后,评审方最需要的就是Excel清单。我们使用 pandas 库将上一步收集的 file_records 列表导出。
```python
def generate_excel_report(data):
if not data:
print("没有文件被处理,跳过生成Excel。")
return
将字典列表转换为DataFrame
df = pd.DataFrame(data)
定义Excel列的顺序,符合阅读习惯
columns_order = ["序号", "归档日期", "归档文件名", "文件类型", "原文件名", "存储路径"]
df = df[columns_order]
try:
导出到Excel
index=False 表示不写入行索引(0,1,2...)
df.to_excel(OUTPUT_EXCEL, index=False, engine='openpyxl')
print(f"\n归档清单已生成: {OUTPUT_EXCEL}")
except Exception as e:
print(f"生成Excel失败: {e}")
```
五、完整可执行代码汇总
将上述代码片段合并,并添加主程序入口。以下是完整的 organize.py 内容,你可以直接复制覆盖:
```python
import os
import shutil
import pandas as pd
from datetime import datetime
配置区域
请将以下路径修改为你电脑上的实际路径
SOURCE_DIR = r'D:\archive_project\source_folder'
TARGET_DIR = r'D:\archive_project\target_folder'
OUTPUT_EXCEL = r'D:\archive_project\归档目录清单.xlsx'
ARCHIVE_PREFIX = "2023年度评审_"
def process_files():
if not os.path.exists(SOURCE_DIR):
print(f"源文件夹不存在: {SOURCE_DIR}")
return []
if not os.path.exists(TARGET_DIR):
os.makedirs(TARGET_DIR)
file_records = []
current_date_str = datetime.now().strftime("%Y%m%d")
files = os.listdir(SOURCE_DIR)
files.sort()
print(f"开始整理,共发现 {len(files)} 个文件...")
for index, filename in enumerate(files):
source_path = os.path.join(SOURCE_DIR, filename)
if not os.path.isfile(source_path):
continue
file_ext = os.path.splitext(filename)[1]
new_filename = f"{ARCHIVE_PREFIX}{current_date_str}_{str(index+1).zfill(3)}{file_ext}"
target_path = os.path.join(TARGET_DIR, new_filename)
try:
shutil.move(source_path, target_path)
file_records.append({
"序号": index + 1,
"原文件名": filename,
"归档文件名": new_filename,
"归档日期": current_date_str,
"文件类型": file_ext[1:].upper(),
"存储路径": target_path
})
print(f"[{index+1}/{len(files)}] 处理完成: {new_filename}")
except Exception as e:
print(f"错误: 无法移动 {filename}, 原因: {e}")
return file_records
def generate_excel_report(data):
if not data:
print("没有数据可生成清单。")
return
df = pd.DataFrame(data)
columns_order = ["序号", "归档日期", "归档文件名", "文件类型", "原文件名", "存储路径"]
df = df[columns_order]
try:
df.to_excel(OUTPUT_EXCEL, index=False, engine='openpyxl')
print(f"\n成功!Excel清单已保存至: {OUTPUT_EXCEL}")
except Exception as e:
print(f"生成Excel失败: {e}")
if __name__ == "__main__":
执行整理
records = process_files()
生成清单
generate_excel_report(records)
```
六、运行验证与结果检查
1. 运行脚本
打开终端(CMD或PowerShell),切换到你的脚本所在目录,然后运行脚本:
```bash
cd D:\archive_project
python organize.py
```
观察终端输出,你应该能看到类似以下的进度信息:
```text
开始整理,共发现 5 个文件...
[1/5] 处理完成: 2023年度评审_20231027_001.pdf
[2/5] 处理完成: 2023年度评审_20231027_002.jpg
...
成功!Excel清单已保存至: D:\archive_project\归档目录清单.xlsx
```
2. 结果检查
- 检查文件夹:打开
target_folder,确认所有文件已经移动过来,且文件名已统一变为“前缀+日期+序号”的格式。
- 检查Excel:打开生成的
归档目录清单.xlsx,检查列头是否清晰,序号是否连续,文件路径是否正确。这份Excel可以直接作为档案评审的移交目录。
七、常见报错处理与扩展
在实操过程中,可能会遇到以下两个常见问题,请参考解决方案:
1. 文件被占用错误
报错信息:PermissionError: [WinError 32] The process cannot access the file
原因:源文件正在被其他程序打开(例如Word或图片查看器未关闭)。
解决:关闭所有预览该文件的程序,重新运行脚本。
2. 编码错误(中文乱码)
如果你的原文件名包含特殊字符且报错,可以在代码第1行添加编码声明(Python3通常默认UTF-8,但某些Windows环境可能需要):
```python
-- coding: utf-8 --
```
3. 进阶扩展:按文件类型分类归档
如果评审要求将图片和文档分开存放,可以修改 process_files 函数中的目标路径逻辑:
```python
示例逻辑片段
if file_ext in ['.jpg', '.png', '.jpeg']:
category_folder = os.path.join(TARGET_DIR, "图片资料")
else:
category_folder = os.path.join(TARGET_DIR, "文档资料")
if not os.path.exists(category_folder):
os.makedirs(category_folder)
修改移动路径
target_path = os.path.join(category_folder, new_filename)
```
通过以上步骤,你已经完成了一套标准化的档案整理评审自动化流程。这不仅解决了手动整理的繁琐,更保证了归档数据的准确性和规范性,完全满足技术评审的硬性指标。