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
相关产品推荐
相关产品推荐

