Python遍历文件夹提取PDF存DataFrame时文件名重复怎么解决
问题原因
- 原代码构建DataFrame时仅传入了循环结束后最后一次赋值的
firstpdfs变量,pandas会自动将单个值广播到所有行,导致所有行的文件名都是最后一个PDF的名称。 - 之前尝试收集文件名时打印出None,是因为Python列表的
append()方法为原地操作,无返回值,默认返回None,实际文件名已经被存入列表,无需打印append的返回值。 - PDF后缀判断逻辑存在语法错误:
if '.pdf' or '.PDF' in i:永远返回True,会把非PDF文件识别为PDF,建议统一转小写后判断后缀。 - 补充:如果没有在每次处理PDF前清空缓存文本的对象,会导致多个PDF的文本累积到同一条记录中。
正确实现代码
import os import re import pandas as pd from pdfminer.pdfpage import PDFPage # 此处保留你原有初始化page_interpreter、fake_file_handle的代码,无需修改 folders = ['F:/a/b/input_data/Sample documents/xyz/', 'F:/a/b/input_data/Sample documents/abc/', 'F:/a/b/input_data/Sample documents/pqr/'] all_text = [] all_pdf_names = [] for folder in folders: all_files = os.listdir(folder) first_pdf = "" for file in all_files: # 修正PDF后缀判断逻辑,大小写通用 if file.lower().endswith('.pdf'): first_pdf = file all_pdf_names.append(first_pdf) print('PDF-Names--', first_pdf) break # 用os.path.join拼接路径避免斜杠匹配问题 pdf_path = os.path.join(folder, first_pdf) with open(pdf_path, 'rb') as fh: # 每次处理新PDF前清空文本缓存,避免文本累积 fake_file_handle.truncate(0) fake_file_handle.seek(0) for page in PDFPage.get_pages(fh, caching=True, check_extractable=True): page_interpreter.process_page(page) text = fake_file_handle.getvalue() cleaned_text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff]', '', text) all_text.append(cleaned_text) # 直接用两个等长列表构建DataFrame,无需explode操作 df = pd.DataFrame({ 'PDF NAME': all_pdf_names, 'Text Data': all_text }) print(df.head(50))
内容的提问来源于stack exchange,提问作者technophile_3
相关产品推荐
相关产品推荐

