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

使用Python3.6.5+PyPDF2合并PDF触发TypeError问题求助

PyPDF2合并PDF时报错TypeError: 'NumberObject' object is not subscriptable的解决办法

嘿,我之前也碰到过这个坑!咱们来一步步拆解问题:

你提到注释掉merger.append之后文件路径能正常打印,说明文件路径本身完全没问题,问题出在PyPDF2读取和处理PDF文件内容的环节上。

报错原因分析

这个错误是PyPDF2旧版本的常见bug——当它处理某些带有特殊元数据或结构的PDF时,会把内部的NumberObject(用来表示PDF里的数值类型)当成字典/列表这类可下标访问的对象,尝试用[]去取值,自然就触发了TypeError。而且你用的Python3.6.5搭配的PyPDF2版本大概率比较老,对这类特殊PDF的兼容性很差。

解决办法

我给你几个实用的修复方案,按优先级来:

  1. 升级PyPDF2到兼容Python3.6的稳定版
    Python3.6虽然已经停止维护,但PyPDF2有支持它的最后几个版本,比如2.12.1。执行下面的命令升级:

    pip install --upgrade PyPDF2==2.12.1
    
  2. 简化PDF读取逻辑,直接传文件路径给append
    你原来的代码是自己创建PdfFileReader实例再传给append,其实merger.append本身可以直接接受文件路径,内部会更稳妥地处理读取逻辑,避免手动创建Reader时的潜在问题。修改后的代码:

    import os
    from PyPDF2 import PdfFileMerger
    
    path = 'C:/test/pdfs'
    merger = PdfFileMerger()
    for pdf in os.listdir(path):
        pdf_path = os.path.join(path, pdf)
        # 先过滤非PDF文件,避免无效读取
        if pdf.lower().endswith('.pdf'):
            merger.append(pdf_path)
    # 最后别忘了保存合并后的文件
    merger.write('C:/test/merged.pdf')
    merger.close()
    
  3. 排查损坏/特殊结构的PDF文件
    如果升级和改代码后还是报错,那大概率是某个PDF文件本身有损坏或者结构异常。可以加个异常捕获定位问题文件:

    import os
    from PyPDF2 import PdfFileMerger
    
    path = 'C:/test/pdfs'
    merger = PdfFileMerger()
    for pdf in os.listdir(path):
        pdf_path = os.path.join(path, pdf)
        if not pdf.lower().endswith('.pdf'):
            continue
        try:
            merger.append(pdf_path)
            print(f"成功处理: {pdf}")
        except Exception as e:
            print(f"处理文件 {pdf} 时出错: {str(e)}")
    merger.write('C:/test/merged.pdf')
    merger.close()
    

为什么注释掉append就正常?

因为注释掉之后,代码只是遍历目录打印路径,完全没有触发PyPDF2对PDF文件内容的解析、读取操作——那个错误是在PyPDF2尝试解析PDF内部结构时才会出现的,和文件路径无关。

内容的提问来源于stack exchange,提问作者krazyboi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:24