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

船舶制造部门档案数字化整理:Python自动化归档实战

发布时间:2026年07月03日 07:05:03 浏览量:0

一、开发环境搭建与依赖库安装

在进行船舶制造部门档案整理时,面对海量的图纸、工艺单及物料清单(BOM),手动分类效率极低。本文将使用Python构建一套自动化工具,实现文件的智能解析、重命名与归档。首先需要配置本地开发环境。

请确保你的系统已安装Python 3.8及以上版本。如果尚未安装,请直接访问Python官网下载安装包:https://www.python.org/downloads/。安装时务必勾选"Add Python to PATH"选项。

打开终端(Windows下为CMD或PowerShell,Mac/Linux下为Terminal),执行以下命令安装本项目所需的第三方库。我们将使用pandas处理数据索引,openpyxl操作Excel文件:

pip install pandas openpyxl

安装完成后,通过以下命令验证环境是否配置成功:

python --version
pip show pandas

二、船舶档案目录结构标准化设计

在编写脚本前,必须先定义一套清晰的目录结构,作为自动化归档的目标路径。建议按照“船号-分段-专业”的层级进行管理。请在你的D盘或工作目录下创建如下结构的文件夹:

D:/ShipArchives/(根目录)

同时,创建一个D:/ShipArchives_Source/文件夹,用于存放待整理的杂乱原始文件。为了演示效果,请在Source文件夹中放入几个命名不规范的文件,例如:“V001图纸.pdf”、“H400管系工艺.docx”、“舾装清单.xlsx”。

三、编写自动化归档核心脚本

D:/ShipArchives/目录下新建一个文本文件auto_archive.py。该脚本将包含文件解析、路径匹配、文件移动及索引生成的完整逻辑。以下是完整的代码实现,可直接复制使用:

```python
import os
import shutil
import pandas as pd
import re
from datetime import datetime

配置区域:请根据实际情况修改路径
SOURCE_DIR = r'D:\ShipArchives_Source'
TARGET_BASE_DIR = r'D:\ShipArchives'
INDEX_FILE = os.path.join(TARGET_BASE_DIR, 'archive_index.xlsx')

定义文件名解析规则(正则表达式)
假设文件名包含:船号(V开头数字)、分段号(H开头数字)、专业关键词
PATTERN_SHIP = re.compile(r'V\d{3}')
PATTERN_BLOCK = re.compile(r'H\d{3}')

专业关键词映射字典,用于识别文件应归属的文件夹
KEYWORD_MAP = {
'structure': ['结构', 'STR', 'Structure', '架'],
'piping': ['管系', 'PIP', 'Piping', '管'],
'outfitting': ['舾装', 'OUT', 'Outfitting', '铁舾', '内装']
}

TYPE_MAP = {
'drawing': ['图', 'dwg', 'pdf'],
'process': ['工艺', '方案', 'docx'],
'list': ['清单', 'BOM', 'xls']
}

def parse_filename(filename):
"""
根据文件名解析元数据
返回: (ship_id, block_id, category, file_type)
"""
ship_match = PATTERN_SHIP.search(filename)
block_match = PATTERN_BLOCK.search(filename)

ship_id = ship_match.group(0) if ship_match else 'UNKNOWN'
block_id = block_match.group(0) if block_match else 'UNKNOWN'

category = 'Others'
for cat, keywords in KEYWORD_MAP.items():
for kw in keywords:
if kw in filename:
category = cat
break
if category != 'Others':
break

file_type = 'Others'
for ftype, keywords in TYPE_MAP.items():
for kw in keywords:
if kw.lower() in filename.lower():
file_type = ftype
break
if file_type != 'Others':
break

return ship_id, block_id, category, file_type

船舶制造部门档案数字化整理:Python自动化归档实战

def build_target_path(ship_id, block_id, category, file_type):
"""
构建目标文件夹路径
"""
如果识别不到船号或分段,放入Unknown文件夹
if ship_id == 'UNKNOWN' or block_id == 'UNKNOWN':
return os.path.join(TARGET_BASE_DIR, 'Unknown_Files')

组装路径:Base/Ship_Block/Category/Type
注意:这里需要将英文分类转为首字母大写以匹配预设文件夹
folder_name = f"{ship_id}_{block_id}"
category_folder = category.capitalize() Structure, Piping, etc.
type_folder = file_type.capitalize() Drawing, Process, etc.

target_path = os.path.join(TARGET_BASE_DIR, folder_name, category_folder, type_folder)
return target_path

def generate_excel_index(data_list):
"""
生成归档索引Excel文件
"""
if not data_list:
return
df = pd.DataFrame(data_list)
调整列顺序
cols = ['原文件名', '船号', '分段号', '专业', '类型', '目标路径', '归档时间']
df = df[cols]

try:
if os.path.exists(INDEX_FILE):
如果文件存在,读取旧数据并追加(去重)
old_df = pd.read_excel(INDEX_FILE)
df = pd.concat([old_df, df]).drop_duplicates(subset=['原文件名', '归档时间'], keep='last')
except Exception as e:
print(f"读取旧索引失败,将创建新文件: {e}")

df.to_excel(INDEX_FILE, index=False)
print(f"索引文件已更新: {INDEX_FILE}")

def main():
if not os.path.exists(SOURCE_DIR):
print(f"源目录不存在: {SOURCE_DIR}")
return

archive_records = []
process_count = 0

print(f"开始扫描目录: {SOURCE_DIR}")

for filename in os.listdir(SOURCE_DIR):
source_file_path = os.path.join(SOURCE_DIR, filename)

跳过文件夹
if os.path.isdir(source_file_path):
continue

解析文件信息
ship_id, block_id, category, file_type = parse_filename(filename)

构建目标路径
target_dir = build_target_path(ship_id, block_id, category, file_type)

创建目标文件夹(如果不存在)
if not os.path.exists(target_dir):
os.makedirs(target_dir, exist_ok=True)

移动文件
target_file_path = os.path.join(target_dir, filename)
try:
shutil.move(source_file_path, target_file_path)
print(f"[成功] {filename} -> {target_dir}")

记录数据
record = {
'原文件名': filename,
'船号': ship_id,
'分段号': block_id,
'专业': category,
'类型': file_type,
'目标路径': target_dir,
'归档时间': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
archive_records.append(record)
process_count += 1
except Exception as e:
print(f"[失败] {filename} 错误: {e}")

生成索引
if archive_records:
generate_excel_index(archive_records)
print(f"处理完成。共归档文件: {process_count} 个")
else:
print("未处理任何文件,请检查源文件命名是否符合规则。")

if __name__ == '__main__':
main()
```

四、脚本核心逻辑解析

上述脚本通过三个核心步骤完成自动化操作,理解这些逻辑有助于你根据实际需求进行微调。

1. 智能解析与正则匹配
代码中的parse_filename函数利用正则表达式re.compile(r'V\d{3}')从文件名中提取船号(如V001)。如果文件名中没有包含“V”开头加3位数字的特征,系统会将其标记为“UNKNOWN”并放入Unknown_Files文件夹,防止文件丢失。关键词映射字典KEYWORD_MAP允许你自定义关键词,例如你可以添加“电气”相关的关键词,使脚本能识别Electrical类文件。

2. 动态路径构建与自动创建
build_target_path函数不依赖硬编码的路径,而是根据解析出的元数据动态拼接字符串。使用os.makedirs(target_dir, exist_ok=True)是一个关键操作,它表示在移动文件前,如果目标多级目录不存在,程序会自动递归创建所有必要的父文件夹,彻底解决了“目标文件夹不存在报错”的问题。

3. 数据留痕与Excel索引生成
单纯归档文件后,查找依然困难。脚本集成了Pandas库,在每次移动文件时,都会记录一条包含“原文件名、目标路径、归档时间”的数据。最后通过df.to_excel将这些记录汇总到archive_index.xlsx中。这个Excel表就是你的数字化档案台账,支持Ctrl+F全局搜索。

五、实操运行与结果验证

代码编写完成后,即可进行实战测试。请确保你的D盘目录结构已经按照第二步建立完毕,且Source文件夹中有测试文件。

1. 打开命令行终端,切换到脚本所在目录:
cd D:\ShipArchives

2. 执行Python脚本:
python auto_archive.py

3. 观察终端输出。你会看到类似以下的日志信息:
[成功] V001图纸.pdf -> D:\ShipArchives\V001_H400\Structure\Drawing
[成功] H400管系工艺.docx -> D:\ShipArchives\V001_H400\Piping\Process
索引文件已更新: D:\ShipArchives\archive_index.xlsx
处理完成。共归档文件: 2 个

4. 打开D:\ShipArchives目录,检查文件是否已准确进入对应的子文件夹。同时打开生成的archive_index.xlsx,确认归档记录是否准确无误。如果遇到文件未移动的情况,请检查文件名是否包含了正则表达式定义的特征字符(如Vxxx)。

微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818