You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 17:27:03