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

如何为含80000条PDF链接的Pandas DataFrame添加对应PDF文本列

解决PDF链接与对应文本行匹配的问题

看起来你的核心问题是文件重复覆盖和行赋值逻辑错误,导致PDF链接和提取的文本没法一一对应,咱们一步步来修复:

问题分析

  1. 文件覆盖问题:每次调用urltopdf()都把PDF内容写入同一个DailyCA.pdf文件,后面的PDF会直接覆盖前面的,最终所有行的文本都是最后一个PDF的内容。
  2. 行赋值逻辑错误:你用allcapex.loc[len(allcapex.index)]是在DataFrame末尾添加新行,而不是给原有链接对应的行设置文本值,自然出现对应关系混乱。
  3. 缺少异常处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:14:07