新手求助:如何用Python实现多Excel/PDF文档信息汇总对比至单Excel?
从多份Excel/PDF提取信息并汇总对比的实现方案
当然可行,Python有大量成熟的第三方工具库,哪怕是新手也能一步步完成这个需求。下面是具体的着手步骤:
一、先装必要的工具库
直接用pip安装就行,这些库分别负责处理Excel、PDF:
pandas:核心的Excel读写和数据处理工具openpyxl:支持读写xlsx格式的Excel文件PyPDF2:提取PDF里的纯文本内容pdfplumber:更精准地提取PDF中的表格数据
安装命令:
pip install pandas openpyxl PyPDF2 pdfplumber
二、分模块实现功能
1. 读取并合并所有Excel文件
用pandas可以轻松读取Excel,还能给每条数据标记来源文件,方便后续对比:
import pandas as pd def load_excel(file_path): # 读取Excel的第一个工作表,需要指定其他表的话改sheet_name参数 df = pd.read_excel(file_path, sheet_name=0) # 添加来源文件列,方便溯源 df['来源文件'] = file_path.split('/')[-1] return df # 把你的Excel文件路径都放在这个列表里 excel_paths = ['文档1.xlsx', '文档2.xlsx'] # 批量读取所有Excel excel_data_list = [load_excel(path) for path in excel_paths] # 合并成一个总数据表 combined_excel = pd.concat(excel_data_list, ignore_index=True)
2. 提取PDF中的信息
PDF分两种情况:纯文本内容和表格内容,分别用不同的方法处理:
提取纯文本
from PyPDF2 import PdfReader def load_pdf_text(file_path): reader = PdfReader(file_path) full_text = '' # 逐页提取文本 for page in reader.pages: page_text = page.extract_text() if page_text: full_text += page_text + '\n' # 转成DataFrame格式,方便和Excel数据合并 text_df = pd.DataFrame({'内容': [full_text], '来源文件': [file_path.split('/')[-1]]}) return text_df
提取表格数据
如果PDF里有规整的表格,用pdfplumber更靠谱:
import pdfplumber def load_pdf_table(file_path): table_list = [] with pdfplumber.open(file_path) as pdf: for page in pdf.pages: # 提取当前页的表格 table = page.extract_table() if table: # 把表格转成DataFrame,第一行作为表头 table_df = pd.DataFrame(table[1:], columns=table[0]) table_df['来源文件'] = file_path.split('/')[-1] table_list.append(table_df) # 合并所有页的表格数据 return pd.concat(table_list, ignore_index=True) if table_list else pd.DataFrame()
注意:如果PDF是扫描件(图片格式),上面的方法没用,得加OCR工具(比如
pytesseract),新手先从可复制的PDF入手。
3. 合并所有数据并对比异同
把Excel和PDF提取的数据合并后,根据你的需求做对比:
# 假设你已经有了combined_excel,以及多个PDF提取的dataframe(比如pdf_text_df、pdf_table_df) all_data = [combined_excel, pdf_text_df, pdf_table_df] total_data = pd.concat(all_data, ignore_index=True) # 示例:按关键字段分组对比,比如以"产品ID"为关键字,看不同文件里的信息差异 compare_result = total_data.groupby('产品ID').agg({ '产品名称': lambda x: ', '.join(set(x)), # 展示不同文件里的产品名称差异 '价格': lambda x: ', '.join(map(str, set(x))), # 展示价格差异 '来源文件': lambda x: ', '.join(x) # 标记数据来自哪些文件 }).reset_index() # 把对比结果导出到新的Excel compare_result.to_excel('汇总对比结果.xlsx', index=False, engine='openpyxl')
4. 按需调整优化
- 如果不同文档的字段名不统一(比如有的叫"产品名"有的叫"品名"),先统一字段名再合并
- 要是需要对比文本内容的具体差异,可以用
difflib库生成差异对比 - 加个异常处理,比如文件不存在、格式错误时给出提示,避免程序崩溃
内容的提问来源于stack exchange,提问作者Johan Ahmed
相关产品推荐
相关产品推荐

