使用PDFplumber提取PDF文本并拆分数据至Excel列的技术问题
解决PDFplumber提取文本后拆分费用行并导出Excel的问题
问题场景
使用PDFplumber爬取PDF数据时,已实现按行提取文本,但无法将类似Retail Rent 444,335.40 75.12 444,335.40 75.12的行拆分为独立列(费用名称、期间累计值、百分比等),需要将文字识别为费用项,后续数值对应不同字段,最终导出到Excel使每个内容对应单独单元格。
解决方案代码
import pdfplumber import pandas as pd import re def extract_and_process_pdf(pdf_path): processed_data = [] # 匹配带千分位逗号、小数点的数值正则表达式 num_pattern = re.compile(r'\d{1,3}(?:,\d{3})*(?:\.\d+)?') with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: lines = page.extract_text().split('\n') for line in lines: stripped_line = line.strip() if not stripped_line: continue # 跳过空行 # 提取当前行所有数值 numeric_values = num_pattern.findall(stripped_line) # 提取费用名称:移除所有数值后清理多余空格 expense_name = re.sub(num_pattern, '', stripped_line).strip() # 组合为一行数据 processed_row = [expense_name] + numeric_values processed_data.append(processed_row) return processed_data # 处理PDF并导出Excel pdf_path = 'Sample_Numbers.pdf' processed_data = extract_and_process_pdf(pdf_path) # 根据实际业务定义列名,可按需调整 column_names = ['费用项', '期间累计值', '期间百分比', '年度累计值', '年度百分比'] # 转换为DataFrame,自动补全缺失值为NaN df = pd.DataFrame(processed_data, columns=column_names) # 导出到Excel文件 df.to_excel('费用数据导出.xlsx', index=False) # 打印处理后的数据预览 for row in processed_data: print(row)
代码说明
- 数值匹配逻辑:使用正则表达式
\d{1,3}(?:,\d{3})*(?:\.\d+)?精准匹配带千分位逗号和小数点的数值,兼容444,335.40、75.12这类格式。 - 拆分行数据:先提取行内所有数值,再移除数值部分得到费用名称,避免因费用名称含空格导致的拆分错误。
- Excel导出:借助pandas的DataFrame结构统一管理数据,导出时自动将每个字段对应到Excel的独立单元格,
index=False避免生成额外的索引列。
内容的提问来源于stack exchange,提问作者megarocker241
相关产品推荐
相关产品推荐

