如何用Python自动将批量.xps文件数据提取至单个.xlsx文件?
批量提取XPS文件中特定字符串数据并汇总至Excel的最佳实现方案
你选的PyMuPDF、pandas、openpyxl这套工具链完全可行,下面是优化后的完整实现方案,以及你可能遗漏的关键环节:
一、核心步骤优化与关键细节
1. XPS文本提取与精准匹配
PyMuPDF读取XPS时只会提取纯文本,自动跳过图表/图片,刚好符合你的需求。针对value1=0.434这类格式的目标数据,正则表达式是最精准的定位方式:
- 用正则
r'value(\d+)=([\d.]+)'可以批量捕获所有valueN=数值格式的内容 - 遍历每个XPS文件的每一页文本,一次性提取所有符合规则的键值对
2. 数据结构化的关键补全
你可能遗漏的核心点:
- 不同XPS文件可能存在变量缺失(比如有的只有value1、value3,没有value2),需要统一列名,缺失值自动补
NaN - 必须记录每个数据对应的源文件名,方便后续数据溯源排查
3. 高效批量处理优化
- 用
os.walk遍历目标文件夹下所有.xps文件,无需手动整理文件名列表 - 加入
tqdm进度提示,处理数千个文件时能直观看到进度
4. Excel导出的稳定性优化
- 用
pandas.ExcelWriter配合openpyxl引擎,支持大文件分块写入,避免内存溢出 - 自动将提取的数值转为浮点型,避免Excel中存为文本格式
二、完整可运行代码示例
import os import re import pandas as pd import fitz # PyMuPDF from tqdm import tqdm # 定义正则规则,匹配valueN=数值格式(支持等号前后带空格的变体) pattern = re.compile(r'value(\d+)\s*=\s*([\d.]+)') # 存储所有文件数据的列表 all_data = [] # 替换为你的XPS文件所在文件夹路径 target_dir = "./xps_files" # 批量遍历处理所有XPS文件 for root, _, files in os.walk(target_dir): for file in tqdm(files): if not file.endswith(".xps"): continue file_path = os.path.join(root, file) file_data = {"源文件名": file} # 记录源文件 # 打开并读取XPS文件 doc = fitz.open(file_path) for page in doc: text = page.get_text() # 提取所有匹配的键值对 matches = pattern.findall(text) for num, val in matches: key = f"value{num}" file_data[key] = float(val) # 转为数值类型 doc.close() all_data.append(file_data) # 转换为DataFrame,自动补全缺失列 df = pd.DataFrame(all_data) # 导出到Excel output_path = "xps数据汇总.xlsx" with pd.ExcelWriter(output_path, engine='openpyxl') as writer: df.to_excel(writer, index=False, sheet_name="数据汇总") print(f"处理完成,结果已保存至{output_path}")
三、特殊情况处理提示
- 如果目标数据有大小写变体(比如
Value1=0.434),可以把正则改成r'[Vv]alue(\d+)\s*=\s*([\d.]+)' - 若部分XPS文本提取异常,尝试用
page.get_text("text")指定纯文本提取模式,或者检查文件是否损坏 - 处理超大规模文件时,可以每处理100个文件就写入一次Excel,避免内存占用过高
内容的提问来源于stack exchange,提问作者teepa
相关产品推荐
相关产品推荐

