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

Python使用Camelot内存读取Zip内PDF表格报错问题咨询

问题根因

报错是两个使用错误导致的,不需要更换库:

  • Camelot的read_pdf接收内存流时要求传入二进制类文件对象,你传入的是文本模式的StringIO对象,Camelot内部处理字节逻辑时找不到对应方法就会抛出你看到的属性错误
  • PDF是二进制格式,你把z.read()拿到的原始字节用latin-1解码成字符串的操作完全多余,还有概率损坏PDF内容。
修正代码

直接用BytesIO包装zip读取到的原始二进制内容即可,不需要做解码操作:

import zipfile
from io import BytesIO
import camelot

z = zipfile.ZipFile(self.zip_file)
for file_name in z.namelist():
    if file_name.lower().endswith(".pdf"):
        # 直接读取原始二进制内容,不要做解码
        pdf_raw = z.read(file_name)
        # 用二进制流包装,替换原来的StringIO
        pdf_stream = BytesIO(pdf_raw)
        # 提取表格,无特殊编码问题不需要传codec参数
        tables = camelot.read_pdf(pdf_stream)
        # 后续表格处理逻辑自行补充

如果你使用的Camelot版本过低不支持直接传内存流,最省事的兼容方案是把二进制内容写入临时文件,传临时文件路径给read_pdf,处理完成后自动删除临时文件即可,性能差异可以忽略。如果确实不想写临时文件,也可以换用pdfplumber,它的表格提取精度和Camelot接近,对内存流的兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:55:18