一、开发环境初始化与依赖安装
为了实现档案制度中认证指标的自动化核查,我们将构建一个基于Python的轻量级审计工具。该工具将自动扫描目标目录,根据预设的指标规则(如命名规范、元数据完整性、文件大小限制等)生成合规性报告。
需要在本地准备Python运行环境。请确保系统已安装Python 3.8或更高版本。打开终端或命令提示符,执行以下命令安装必要的第三方依赖库:
```bash
pip install pandas openpyxl colorama
```
依赖库说明:
- pandas:用于处理核查结果数据并导出Excel报告。
- openpyxl:用于支持Excel文件的读写操作。
- colorama:用于在控制台输出带颜色的日志,方便在终端直观查看错误信息。
安装完成后,在项目根目录下创建以下文件夹结构,保持目录规范:
```text
archive_audit_system/
├── config.json 指标配置文件
├── auditor.py 核心审计脚本
└── audit_report.xlsx 生成的报告(运行后生成)
```
二、认证指标配置文件构建
档案制度建设的核心在于指标的数字化定义。我们将通过config.json文件将管理制度转化为机器可读的规则。请创建config.json文件,并填入以下完整配置。该配置定义了文件命名规范、必填元数据、文件大小限制及允许的文件类型。
```json
{
"audit_rules": {
"naming_convention": {
"enabled": true,
"pattern": "^[A-Z]{2,4}-\\d{4}-\\d{3}[A-Z]?-\\.(pdf|docx|jpg)$",
"description": "文件名必须符合:部门代码(2-4位大写)-年份(4位)-流水号(3位加可选字母).后缀"
},
"file_size_restrictions": {
"enabled": true,
"max_size_mb": 50,
"description": "单个档案文件大小不得超过50MB"
},
"allowed_extensions": {
"enabled": true,
"extensions": [".pdf", ".docx", ".doc", ".jpg", ".png", ".ofd"],
"description": "仅允许上传指定格式的文件"
},
"metadata_integrity": {
"enabled": true,
"check_empty_file": true,
"description": "检查文件是否为空文件或损坏文件"
}
},
"scan_settings": {
"target_directory": "./test_files",
"recursive_scan": true
}
}
```
配置详解:
- naming_convention.pattern:使用正则表达式定义文件名规则。例如,“TECH-2023-001A.pdf”符合上述规则。
- file_size_restrictions.max_size_mb:设定单文件最大体积阈值,单位MB。
- allowed_extensions:白名单机制,不在列表中的后缀名将直接标记为不合规。
- scan_settings.target_directory:待扫描的档案文件夹路径。请手动在项目根目录下创建
test_files文件夹,并放入一些测试文件(如符合规范的FINA-2023-002.pdf和不符合规范的test.txt)以验证效果。
三、核心审计引擎代码实现

接下来编写核心审计逻辑。创建auditor.py,该脚本将加载配置、遍历文件、执行规则检查并输出结果。代码包含完整的错误处理和日志输出,确保在生产环境中稳定运行。
```python
import os
import re
import json
import pandas as pd
from datetime import datetime
from colorama import Fore, Style, init
初始化colorama
init(autoreset=True)
class ArchiveAuditor:
def __init__(self, config_path='config.json'):
self.config = self.load_config(config_path)
self.results = []
self.rules = self.config.get('audit_rules', {})
self.settings = self.config.get('scan_settings', {})
def load_config(self, path):
try:
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
print(f"{Fore.RED}错误:配置文件 {path} 未找到。{Style.RESET_ALL}")
exit(1)
except json.JSONDecodeError:
print(f"{Fore.RED}错误:配置文件 {path} 格式不正确。{Style.RESET_ALL}")
exit(1)
def check_naming_convention(self, filename):
if not self.rules['naming_convention']['enabled']:
return True, "规则未启用"
pattern = self.rules['naming_convention']['pattern']
if re.match(pattern, filename):
return True, "符合命名规范"
else:
return False, f"不符合命名规范: {self.rules['naming_convention']['description']}"
def check_file_size(self, file_path):
if not self.rules['file_size_restrictions']['enabled']:
return True, "规则未启用"
size_mb = os.path.getsize(file_path) / (1024 1024)
max_size = self.rules['file_size_restrictions']['max_size_mb']
if size_mb <= max_size:
return True, f"{size_mb:.2f}MB"
else:
return False, f"文件过大: {size_mb:.2f}MB (限制: {max_size}MB)"
def check_extension(self, filename):
if not self.rules['allowed_extensions']['enabled']:
return True, "规则未启用"
_, ext = os.path.splitext(filename)
allowed = self.rules['allowed_extensions']['extensions']
if ext.lower() in allowed:
return True, "允许的格式"
else:
return False, f"禁止的文件格式: {ext}"
def check_metadata_integrity(self, file_path):
if not self.rules['metadata_integrity']['enabled']:
return True, "规则未启用"
if self.rules['metadata_integrity']['check_empty_file']:
if os.path.getsize(file_path) == 0:
return False, "文件为空"
此处可扩展更复杂的元数据检查,如读取PDF头信息等
return True, "元数据完整"
def audit_file(self, root, filename):
file_path = os.path.join(root, filename)
file_stat = os.stat(file_path)
record = {
"文件路径": file_path,
"文件名": filename,
"扫描时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"大小(MB)": round(file_stat.st_size / (1024 1024), 2),
"命名规范检查": "-",
"文件大小检查": "-",
"文件格式检查": "-",
"元数据完整性": "-",
"是否合规": True
}
执行各项检查
name_pass, name_msg = self.check_naming_convention(filename)
record["命名规范检查"] = name_msg
if not name_pass: record["是否合规"] = False
size_pass, size_msg = self.check_file_size(file_path)
record["文件大小检查"] = size_msg
if not size_pass: record["是否合规"] = False
ext_pass, ext_msg = self.check_extension(filename)
record["文件格式检查"] = ext_msg
if not ext_pass: record["是否合规"] = False
meta_pass, meta_msg = self.check_metadata_integrity(file_path)
record["元数据完整性"] = meta_msg
if not meta_pass: record["是否合规"] = False
self.results.append(record)
status_icon = f"{Fore.GREEN}[PASS]{Style.RESET_ALL}" if record["是否合规"] else f"{Fore.RED}[FAIL]{Style.RESET_ALL}"
print(f"{status_icon} {filename} - {name_msg}")
def run_scan(self):
target_dir = self.settings['target_directory']
recursive = self.settings['recursive_scan']
print(f"{Fore.CYAN}开始扫描目录: {target_dir}{Style.RESET_ALL}")
print("-" 50)
if not os.path.exists(target_dir):
print(f"{Fore.RED}错误:目标目录 {target_dir} 不存在。{Style.RESET_ALL}")
return
for root, dirs, files in os.walk(target_dir):
for filename in files:
self.audit_file(root, filename)
if not recursive:
break
self.generate_report()
def generate_report(self):
if not self.results:
print(f"{Fore.YELLOW}未扫描到任何文件。{Style.RESET_ALL}")
return
df = pd.DataFrame(self.results)
report_file = "audit_report.xlsx"
try:
df.to_excel(report_file, index=False, engine='openpyxl')
print("-" 50)
print(f"{Fore.GREEN}扫描完成!报告已生成: {report_file}{Style.RESET_ALL}")
pass_count = len(df[df['是否合规'] == True])
fail_count = len(df[df['是否合规'] == False])
print(f"总计文件: {len(df)} | 合规: {pass_count} | 不合规: {fail_count}")
except Exception as e:
print(f"{Fore.RED}生成报告失败: {str(e)}{Style.RESET_ALL}")
if __name__ == "__main__":
auditor = ArchiveAuditor()
auditor.run_scan()
```
代码逻辑解析:
- ArchiveAuditor类:封装了所有审计逻辑,保证全局命名空间整洁。
- check_naming_convention:利用Python的
re模块进行正则匹配,这是实现档案命名规范自动化检查的关键。
- check_file_size:通过
os.path.getsize获取文件字节数并转换为MB进行比对。
- audit_file:聚合所有检查项的结果,生成包含详细信息的字典,并实时在控制台打印进度。
- generate_report:利用
pandas将结果列表瞬间转换为Excel表格,方便管理人员进行后续的整改工作。
四、执行核查与报告生成
代码与配置准备就绪后,直接运行脚本即可开始自动化核查。在终端执行以下命令:
```bash
python auditor.py
```
系统将立即开始扫描test_files目录下的所有文件。控制台会实时输出每个文件的检查状态:
- [PASS]:表示该文件通过了所有启用的认证指标检查。
- [FAIL]:表示该文件存在不合规项,后面会附带具体原因(如“不符合命名规范”或“文件过大”)。
扫描结束后,当前目录下会生成audit_report.xlsx文件。打开该Excel文件,你将看到一张包含以下列的详细数据表:
- 文件路径:定位问题文件的具体位置。
- 命名规范检查:具体的通过/失败信息。
- 文件大小检查:实际大小及是否符合限制。
- 是否合规:最终的布尔值判断,可用于Excel筛选功能快速筛选出所有False(不合规)的文件。
通过上述步骤,我们已经将抽象的“档案制度建设认证指标”转化为了可执行、可复用的自动化代码。这套系统可以根据实际制度文档随时修改config.json中的正则表达式或阈值,无需改动代码即可适应不同的认证标准,实现了技术对业务管理的零门槛支撑。