一、环境准备与依赖安装
在开始构建档案目录生成工具之前,必须确保运行环境满足要求。本指南基于Python 3.9版本开发,利用其原生的pathlib库处理路径,无需安装复杂的第三方依赖,确保在Windows、Linux及macOS上均可直接运行。
1. 安装Python环境
如果尚未安装Python,请直接访问Python官网下载对应操作系统的安装包。请务必勾选"Add Python to PATH"选项,以便在命令行中直接调用。
- Windows下载地址:
https://www.python.org/downloads/windows/
- 验证安装:打开终端或CMD,输入
python --version,确认返回版本号为3.9或更高。
2. 创建项目目录
在本地磁盘创建一个名为archive_tool的文件夹,并在其中新建两个文本文件,分别重命名为config.json和builder.py。我们将通过这两个文件实现从“制度定义”到“目录落地”的全过程。
二、定义档案分类标准配置
档案制度建设的核心在于“分类方案”的标准化。我们将通过JSON格式定义一套企业级的档案分类标准。这种方式既符合技术规范,又能让非技术人员通过修改文本文件直接调整制度。请打开config.json,粘贴以下完整配置代码:
```json
{
"archive_standard": {
"org_name": "某某集团有限公司",
"code_prefix": "ARC",
"root_path": "./EnterpriseArchives",
"retention_rules": {
"Y": "永久",
"30Y": "30年",
"10Y": "10年"
}
},
"categories": [
{
"code": "100",
"name": "文书档案",
"description": "行政管理、经营决策、人事管理等综合性文件",
"sub_categories": [
{
"code": "110",
"name": "行政类",
"retention": "30Y",
"structure": ["年度", "保管期限", "机构问题"]
},
{
"code": "120",
"name": "人事类",
"retention": "永久",
"structure": ["年度", "保管期限", "员工编号"]
}
]
},
{
"code": "200",
"name": "科技档案",
"description": "产品研发、基本建设、设备仪器等技术性文件",
"sub_categories": [
{
"code": "210",
"name": "产品研发",
"retention": "30Y",
"structure": ["项目代号", "阶段", "专业"]
}
]
},
{
"code": "300",
"name": "会计档案",
"description": "凭证、账簿、报表等财务记录",
"sub_categories": [
{
"code": "310",
"name": "会计凭证",
"retention": "30Y",
"structure": ["年度", "月份", "凭证号段"]
}
]
}
]
}
```
上述配置文件定义了三个一级门类(文书、科技、会计)及其对应的二级门类。其中"structure"字段是关键,它决定了目录树的具体层级结构。例如,行政类档案将按照“年度 -> 保管期限 -> 机构问题”的顺序生成文件夹。
三、编写目录生成核心脚本
接下来编写解析配置并生成物理目录的Python脚本。该脚本将读取JSON配置,根据structure定义递归创建文件夹,并在每个最底层目录中生成一个README.md文件,用于指导业务人员如何归档。请打开builder.py,输入以下代码:
```python
import json
import os
from pathlib import Path
def load_config(config_path):
"""加载并验证JSON配置文件"""
try:
with open(config_path, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
print(f"错误:找不到配置文件 {config_path}")
exit(1)
except json.JSONDecodeError:
print(f"错误:{config_path} 格式不正确,请检查JSON语法")
exit(1)
def create_structure(base_path, structure_list, retention_rules, context_info):
"""
递归创建目录结构
base_path: 当前基础路径
structure_list: 剩余待创建的层级列表
context_info: 上下文信息(用于生成README)
"""
if not structure_list:
到达最底层,创建说明文件
readme_content = f""" 归档说明目录
本目录用于存放:{context_info.get('category_name', '未知门类')}
所属全宗:{context_info.get('org_name', '未知机构')}
保管期限:{context_info.get('retention', '未定义')}
归档要求:
1. 请勿在此目录下直接创建文件夹,请将文件归档至对应年度或项目文件夹内。
2. 文件命名格式建议:日期-部门-题名(例如:20231012-财务部-年度预算批复.pdf)
3. 禁止存放涉密文件,如有涉密需求请联系信息中心。
"""
(base_path / "README.md").write_text(readme_content, encoding='utf-8')
return
current_level = structure_list[0]
remaining_levels = structure_list[1:]
根据层级类型生成预设文件夹
if current_level == "年度":
自动生成近5年及历史目录
for year in range(2020, 2026):
year_path = base_path / str(year)
create_directory(year_path)
create_structure(year_path, remaining_levels, retention_rules, context_info)
(base_path / "历史").mkdir(exist_ok=True)
elif current_level == "保管期限":
根据配置生成保管期限目录
如果当前门类有特定期限,则优先使用,否则使用所有规则
specific_retention = context_info.get('retention')
if specific_retention:
retention_name = retention_rules.get(specific_retention, specific_retention)
ret_path = base_path / retention_name
create_directory(ret_path)
create_structure(ret_path, remaining_levels, retention_rules, context_info)
else:
for code, name in retention_rules.items():
ret_path = base_path / name
create_directory(ret_path)
create_structure(ret_path, remaining_levels, retention_rules, context_info)
elif current_level == "月份":
for month in range(1, 13):
month_str = f"{month:02d}月"
month_path = base_path / month_str
create_directory(month_path)
create_structure(month_path, remaining_levels, retention_rules, context_info)
else:
对于项目代号、机构问题等动态变量,创建一个占位符目录作为示例
placeholder_path = base_path / f"【{current_level}】请在此处创建具体文件夹"
create_directory(placeholder_path)
这里不再递归,避免生成过多无意义空目录,实际业务中由人工创建下级
def create_directory(path):
"""创建目录并打印日志"""
if not path.exists():
path.mkdir(parents=True, exist_ok=True)
print(f"[创建目录] {path}")
else:
print(f"[目录已存在] {path}")
def main():
config = load_config('config.json')
获取配置项
standard = config['archive_standard']
categories = config['categories']
root_path = Path(standard['root_path'])
print(f"开始初始化档案库:{root_path.absolute()}")
print(f"机构名称:{standard['org_name']}")
遍历所有一级门类
for cat in categories:
cat_code = cat['code']
cat_name = cat['name']
cat_path = root_path / f"{cat_code} {cat_name}"
create_directory(cat_path)
遍历二级门类
for sub_cat in cat.get('sub_categories', []):
sub_code = sub_cat['code']
sub_name = sub_cat['name']
sub_path = cat_path / f"{sub_code} {sub_name}"
create_directory(sub_path)
准备上下文信息用于生成README
context = {
'org_name': standard['org_name'],
'category_name': sub_name,
'retention': sub_cat.get('retention')
}
开始递归创建层级结构
create_structure(
base_path=sub_path,
structure_list=sub_cat['structure'],
retention_rules=standard['retention_rules'],
context_info=context
)
print("\n档案目录结构初始化完成!")
if __name__ == "__main__":
main()
```
四、执行脚本与效果验证
代码编写完成后,即可进行实际操作。这一步将把数字化的制度转化为物理的文件夹结构。

1. 运行生成命令
在archive_tool文件夹下打开命令行终端,执行以下命令:
```bash
python builder.py
```
2. 观察输出日志
终端将滚动显示创建过程,输出如下内容表示运行正常:
[创建目录] ./EnterpriseArchives
[创建目录] ./EnterpriseArchives/100 文书档案
[创建目录] ./EnterpriseArchives/100 文书档案/110 行政类
[创建目录] ./EnterpriseArchives/100 文书档案/110 行政类/2020
[创建目录] ./EnterpriseArchives/100 文书档案/110 行政类/2020/30年
...
3. 检查生成的目录结构
进入文件管理器,打开EnterpriseArchives文件夹。你将看到如下标准的树状结构:
EnterpriseArchives/
├── 100 文书档案/
│ ├── 110 行政类/
│ │ ├── 2020/
│ │ │ └── 30年/
│ │ │ └── README.md (包含归档说明)
│ │ ├── 2021/
│ │ │ └── 30年/
│ │ │ └── README.md
│ │ └── ...
│ └── 120 人事类/
│ └── 2020/
│ └── 永久/
│ └── README.md
├── 200 科技档案/
│ └── 210 产品研发/
│ └── 【项目代号】请在此处创建具体文件夹
└── 300 会计档案/
└── 310 会计凭证/
└── 2020/
├── 01月/
├── 02月/
└── ...
打开任意一个README.md文件,你将看到根据该门类配置自动生成的归档说明,包含了保管期限和具体的命名规范建议。
五、扩展:合规性自动校验功能
制度建设不仅包括“建”,还包括“管”。为了确保员工上传的文件符合命名规范,我们可以增加一个简单的校验脚本。在archive_tool目录下新建validator.py,并输入以下代码:
```python
import re
import os
from pathlib import Path
定义简单的命名规范正则:日期(8位)-部门-题名.扩展名
示例:20231012-财务部-预算.pdf
NAMING_PATTERN = re.compile(r"^\d{8}-[^-]+-.+\.(pdf|doc|docx|jpg|png)$", re.IGNORECASE)
def validate_directory(root_path):
print(f"开始校验目录:{root_path}")
error_count = 0
checked_count = 0
for file_path in Path(root_path).rglob(""):
if file_path.is_file() and file_path.name != "README.md":
checked_count += 1
if not NAMING_PATTERN.match(file_path.name):
print(f"[违规] {file_path} 文件名不符合规范")
error_count += 1
else:
print(f"[通过] {file_path.name}")
print(f"\n校验完成。共检查 {checked_count} 个文件,发现 {error_count} 个违规文件。")
if __name__ == "__main__":
校验刚才生成的目录
target_dir = "./EnterpriseArchives"
if os.path.exists(target_dir):
validate_directory(target_dir)
else:
print("请先运行 builder.py 生成目录")
```
运行校验命令:
```bash
python validator.py
```
此脚本将递归扫描所有生成的文件夹,并检查文件名是否符合“日期-部门-题名”的格式。对于不符合规范的文件,控制台将输出红色(或高亮)的[违规]提示。你可以根据实际业务需求修改NAMING_PATTERN正则表达式来调整严格程度。