Python如何批量提取多子文件夹PDF文本并按指定格式存入Excel
问题修复方案
原有代码核心问题
- 函数内变量命名冲突:循环迭代时覆盖了存储结果的列表变量,且调用append的
line变量未定义,运行会直接抛出NameError - 文本处理逻辑不符合需求:将PDF文本按换行符拆分为独立字符串元素,最终生成的表格会把单行文本拆分到不同单元格,无法实现全文本存在同一单元格的要求
- 文件遍历范围不足:仅用
os.listdir只能读取根目录下的直接文件,无法递归获取所有子文件夹内存储的PDF - 输出格式不匹配:最终导出为CSV文件,且数据结构不符合指定的Excel存储规则
前置依赖安装
先执行以下命令安装需要的第三方库:pip install pdfplumber pandas openpyxl
完整实现代码
import pdfplumber import pandas as pd import os def extract_pdf_text(pdf_path): # 直接拼接所有页面的文本为单个完整字符串,不拆分行 full_text = "" with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: page_text = page.extract_text() # 处理扫描页/空白页提取不到文本的情况,避免报错 if page_text: full_text += page_text + "\n" return full_text.strip() # 替换成你的根文件夹实际路径 root_folder = "你的根文件夹实际路径" excel_content = [] # 递归遍历根目录下所有子文件夹、文件 for folder_path, sub_folders, file_names in os.walk(root_folder): for file_name in file_names: # 筛选PDF文件,兼容大小写后缀 if file_name.lower().endswith(".pdf"): pdf_full_path = os.path.join(folder_path, file_name) # 按要求顺序添加:先加文件名,再加提取的完整文本 excel_content.append(file_name) pdf_text = extract_pdf_text(pdf_full_path) excel_content.append(pdf_text) # 构造DataFrame,所有内容存在A列 df = pd.DataFrame(excel_content, columns=None) # 导出为Excel文件,不保存索引和表头 df.to_excel("pdf_text_result.xlsx", index=False, header=False)
效果说明
- 自动递归遍历指定根文件夹下所有层级子文件夹内的PDF文件,兼容大小写.pdf后缀
- 导出的Excel文件中,A1、A3、A5…奇数行单元格依次存储每个PDF的文件名,对应的A2、A4、A6…偶数行单元格存储该PDF提取的完整文本,所有文本不会拆分,全部存放在同一个单元格内
- 自动处理空白页、扫描页无文本的情况,不会因提取结果为空抛出报错
可选格式调整
如果你需要改成「每个PDF占1行,A列存文件名、B列存对应文本」的更常见格式,只需要替换代码中遍历文件构造数据、导出Excel的部分即可:
excel_content = [] # 递归遍历根目录下所有子文件夹、文件 for folder_path, sub_folders, file_names in os.walk(root_folder): for file_name in file_names: # 筛选PDF文件,兼容大小写后缀 if file_name.lower().endswith(".pdf"): pdf_full_path = os.path.join(folder_path, file_name) pdf_text = extract_pdf_text(pdf_full_path) excel_content.append([file_name, pdf_text]) # 构造带表头的DataFrame df = pd.DataFrame(excel_content, columns=["PDF文件名", "提取文本"]) # 导出为Excel文件 df.to_excel("pdf_text_result.xlsx", index=False)
内容的提问来源于stack exchange,提问作者Gabry
相关产品推荐
相关产品推荐

