# file-processing-script **Repository Path**: bingbingyihao/file-processing-script ## Basic Information - **Project Name**: file-processing-script - **Description**: No description available - **Primary Language**: Shell - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-10 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 文件批处理脚本集 围绕「企业台账批量处理」与「RAGFlow 知识库语料准备」沉淀的一组批处理脚本, 分两条互不依赖的流水线。全部脚本可在 Windows + PowerShell 5.1 / Python 3 下直接运行, 无需编译、无需额外服务。 | 流水线 | 解决的问题 | 目录 | | --- | --- | --- | | **A. 压缩包递归展开 + 文档转 PDF** | 台账里压缩包层层嵌套(zip 套 rar 套 tar.gz),里面装着 Word/PPT;需要先逐层解干净,再把文档批量转 PDF 上传知识库 | [`文件类型批量转换/`](./文件类型批量转换/) | | **B. 表格链接批量下图 + MD5 去重 + 入库/测试切分** | 违章台账单元格里塞了成百上千条图片链接;需要并发下图、按内容去重、跨批次合并,并划分出检索入库集与测试集 | [`图片批量下载/`](./图片批量下载/) | > **A 线的详细参数、全量流程、退出码与排错表见 > [文件类型批量转换/README.md](./文件类型批量转换/README.md)** —— 那份文档按脚本逐参数整理, > 且所有结论都经过实跑验证。本文件只做导览与 B 线说明,避免两处维护同一份参数表而失配。 --- ## 目录结构 ``` . ├── README.md ← 本文件(总览) ├── .gitignore ← 忽略脚本产物与原始数据,防敏感文件入库 ├── LICENSE ← Apache-2.0 ├── 文件类型批量转换/ │ ├── README.md ← A 线完整使用文档(重点看这份) │ ├── unpack-archives.ps1 ← 递归解压 zip/rar/7z/tar.gz…,坏包自动跳过 │ ├── docs2pdf.ps1 ← .doc/.docx → PDF(递归) │ ├── ppt2pdf.ps1 ← .ppt/.pptx → PDF(递归) │ └── count-filetypes.ps1 ← 文件类型分布统计(只读) └── 图片批量下载/ ├── extract_images.py ← 读台账链接并发下图,按内容 MD5 去重 ├── merge_md5_lists.py ← 按前缀分组合并多份清单并去重 └── split_images_by_md5.py ← 按 MD5 切 2/3 入库集、1/3 测试集 ``` 四个 PowerShell 脚本共享同一套约定:**`-Path` 可省略,默认取脚本同级的「上级文件台账」目录**, 且**默认递归全部子目录**。 --- ## 环境要求 | 流水线 | 必需 | 可选/建议 | | --- | --- | --- | | A | PowerShell 5.1(系统自带) | **7-Zip(强烈建议)**、WinRAR、Word/WPS/PowerPoint/LibreOffice 至少其一(转 PDF 用) | | B | Python 3 + `openpyxl` + `requests` | — | ```cmd pip install openpyxl requests ``` 引擎体检与安装说明见 [文件类型批量转换/README.md 第二节](./文件类型批量转换/README.md)。 --- ## A 线快速上手 ```powershell cd 文件类型批量转换 $src = "D:\台账" .\unpack-archives.ps1 -Path $src -List # 1) 预览会解哪些包(零写操作) .\unpack-archives.ps1 -Path $src # 2) 逐层解压到 $src\extracted(原件只读) .\docs2pdf.ps1 -Path "$src\extracted" -OutDir "$src\pdf_out" -List # 3) 预览 .\docs2pdf.ps1 -Path "$src\extracted" -OutDir "$src\pdf_out" # 递归转 PDF .\ppt2pdf.ps1 -Path "$src\extracted" -OutDir "$src\ppt_pdf_out" # PPT 同理 ``` 三条最该先知道的结论: 1. **解压脚本默认把输入整体复制到 `extracted\` 后再解,原始目录一个字节都不改**;磁盘紧张用 `-InPlace`。 2. **坏包不会中断流程**:损坏、伪装、缺分卷、需口令的包只记 `Failed` 后跳过,全部明细写在 `_unpack_report.csv`(含每个包处于第几层、用哪个引擎解的、失败原因)。 3. **`-List` 先跑一遍再执行**,四个脚本都支持预览;中断后重跑都会自动跳过已完成的部分。 --- ## B 线使用说明 三个脚本按「下图 → 合并 → 切分」顺序串联,也可各自独立运行。均在**脚本所在目录**下运行, 读写当前目录,配置项写在每个文件顶部的「可配置」区块里。 ### 1) `extract_images.py` —— 批量下图 + 按内容去重 读取多个台账表格,把「问题描述图片」列里的 http(s) 链接逐条下载,按**图片内容 MD5** 去重落盘。 ```cmd python extract_images.py ``` - **表格要求**:表头需含 `违章示例`、`问题描述图片` 两列;脚本会自动跳过开头的全空行定位表头, 单元格内多行链接会逐条拆分(只取 http/https 开头的行)。 - **待处理文件**:默认自动扫描当前目录全部 `.xlsx`(排除模板与输出文件);只处理指定文件就改顶部 `INPUT_FILES = ["a.xlsx", "b.xlsx"]`。 - **类型取值**:每行图片的外挂类型取该行「违章示例」,为空时回退为源文件名。 - **下载**:`WORKERS = 8` 并发线程(每线程独立 Session,网络好可调到 16),失败自动重试 3 次。 - **扩展名**:优先取链接里的 `fileExt=`,否则按文件头魔数判断(JPEG/PNG/GIF/BMP/WEBP)。 产物: | 文件 | 内容 | | --- | --- | | `images/` | 去重后的图片,文件名 = `md5.扩展名` | | `图片提取结果.xlsx` | 明细,**每个链接一行**:`违章示例 \| 图片链接 \| 图片md5` | | `图片外挂类型模板.xlsx` | **去重后一图一行**:`图片MD5 \| 外挂类型`(会保留原表头行) | | `运行日志.txt` | 下载失败明细 + 「同一 MD5 重复出现在哪些文件哪几行」的提示 | > 脚本会 `load_workbook(TEMPLATE_FILE)` 打开既有模板写入,因此**运行前当前目录需存在 > `图片外挂类型模板.xlsx`**(首行为表头即可);同时会清空第 2 行起的旧数据再写入本次结果。 ### 2) `merge_md5_lists.py` —— 跨批次合并去重 把多份两列表格(`图片MD5 | 外挂类型`)按**文件名前缀**分组各自汇总。 ```cmd python merge_md5_lists.py ``` - **分组配置**在顶部 `GROUPS`,默认两组:前缀 `对齐图片清单` → `汇总_对齐图片清单.xlsx`; 前缀 `图片外挂类型` → `汇总_图片外挂类型.xlsx`。要加新组就在列表里追加一行。 - **累加**:汇总文件已存在时会先并入其中的历史记录,再合并本轮新文件,实现跨批次累加。 - **去重规则**:按 MD5 去重并保留首次出现;若该条类型为空,用后续出现的**首个非空类型**补齐。 - **防重复处理**:汇总写入成功后,本轮读到的源文件会被**移动**到 `已处理/` 子目录。 > 两个真实注意点(均由脚本逻辑决定): > - 汇总文件名**不要以源文件前缀开头**,否则下次运行会把自己的输出当成输入再读一遍 > (默认配置已规避:`汇总_…` 不以 `对齐图片清单`/`图片外挂类型` 开头)。 > - `extract_images.py` 的输出 `图片外挂类型模板.xlsx` **恰好以 `图片外挂类型` 开头**, > 所以会被第 2 组合并读入。若不想让它参与合并,改名或在合并前移走即可。 ### 3) `split_images_by_md5.py` —— 切分入库集 / 测试集 从汇总表格读 MD5 列表,在 `images/` 中按文件名匹配图片,按比例复制到两个目录。 ```cmd python split_images_by_md5.py ``` - 配置项在顶部:`XLSX_FILE`(读哪个汇总)、`IMAGE_DIR=images`、`OUT_ROOT=filter_images`、 `DIR_LIB=入库`、`DIR_TEST=测试`。换一批数据只改 `XLSX_FILE` 后重跑。 - **切分规则固定可复现**:按 MD5 字符串排序后,**前 2/3 进 `filter_images/入库/`,其余进 `filter_images/测试/`**;同一份清单重复运行得到完全相同的结果。 - 复制用 `copy2`(保留时间戳),源图片不会被删除或移动。 - 汇总里有、但 `images/` 中找不到的 MD5 会打印告警(最多列 20 个)并继续,不影响其余图片复制。 --- ## 数据安全提醒 `.gitignore` 已配置为忽略:脚本产物(`extracted/`、`pdf_out/`、`ppt_pdf_out/`、 `filetype_report/`、各类 `_*.csv` 报表)、图片批量下载的中间与结果文件(`images/`、 `filter_images/`、`已处理/`、`汇总_*.xlsx` 等)、以及**原始资料**(`上级文件台账/` 与全局 `*.zip / *.rar / *.7z / *.tar / *.gz / *.iso …`)。 **本仓库为公开仓库,请勿把企业台账、内部文档、原始压缩包提交上来。** 需要提交示例数据时, 请自行脱敏后放入 `examples/`,并在 `.gitignore` 末尾用 `!examples/**.zip` 这类规则显式放行。 另有两处容易踩的物理限制: - **Windows 路径 260 字符上限**:递归解压会让每层路径加深,建议把待处理目录放在浅路径 (如 `D:\t\`),或用 `-MaxDepth` 限制解压层数。 - **多层嵌套会重复同一份文档**:解压默认保留原压缩包,因此同一文件可能在多个层级各留一份, 转 PDF 时也会镜像出多份。确认解压结果无误后用 `-RemoveArchive` 重跑即可只留最外层一份。 --- ## License [Apache-2.0](./LICENSE)