如何为含80000条PDF链接的Pandas DataFrame添加对应PDF文本列
解决PDF链接与对应文本行匹配的问题
看起来你的核心问题是文件重复覆盖和行赋值逻辑错误,导致PDF链接和提取的文本没法一一对应,咱们一步步来修复:
问题分析
- 文件覆盖问题:每次调用
urltopdf()都把PDF内容写入同一个DailyCA.pdf文件,后面的PDF会直接覆盖前面的,最终所有行的文本都是最后一个PDF的内容。 - 行赋值逻辑错误:你用
allcapex.loc[len(allcapex.index)]是在DataFrame末尾添加新行,而不是给原有链接对应的行设置文本值,自然出现对应关系混乱。 - 缺少异常处理:80000条数据里必然会存在无效链接、损坏PDF等情况,没有异常处理会导致程序中途崩溃,前功尽弃。
优化后的代码方案
咱们可以把两个函数合并,直接从URL读取PDF内容到内存处理,跳过本地文件存储(既省时间又避免覆盖问题),再用正确的方式给每行匹配对应文本:
import urllib.request import PyPDF2 import pandas as pd def url_to_text(link): try: # 从URL获取PDF内容到内存,无需存本地文件 req = urllib.request.urlopen(link) pdf = PyPDF2.PdfFileReader(req) text_content = [] for page_num in range(pdf.numPages): page = pdf.getPage(page_num) text_content.append(page.extractText()) return ''.join(text_content) except Exception as e: # 捕获异常,返回空字符串或错误信息,避免程序崩溃 print(f"处理链接 {link} 时出错: {str(e)}") return "" # 假设你的原始数据源是包含Source列的result DataFrame # 直接为result添加Text列,用apply实现链接与文本的一一对应 result['Text'] = result['Source'].apply(url_to_text) # 如果需要单独的allcapex DataFrame,直接复制所需列即可 allcapex = result[['Source', 'Text']].copy() print(allcapex.head())
关键改进点
- 内存中处理PDF:跳过本地文件存储步骤,直接从URL读取PDF内容并提取文本,彻底解决文件覆盖问题。
- 正确的列赋值逻辑:用
apply方法遍历Source列的每个链接,把提取的文本直接赋值到对应行的Text单元格,完美实现一一匹配。 - 异常容错机制:添加
try-except块,遇到无效链接或损坏PDF时,程序不会崩溃,还能打印错误信息方便后续排查问题。
额外加速建议
如果80000条数据处理速度太慢,可以用并行处理提升效率,比如借助swifter库自动实现并行apply:
import swifter result['Text'] = result['Source'].swifter.apply(url_to_text)
内容的提问来源于stack exchange,提问作者Jay shankarpure
相关产品推荐
相关产品推荐

