Python3 PyPDF2 - 如何将文件处理程序视为 BytesIO 对象?

Python3 PyPDF2 - how to treat file handlers as BytesIO objects?

有一个不错的、经过测试的 python PyPDF2 代码 .py 旨在对 'real' OS 文件进行操作。调试完所有内容后,我现在正尝试将其合并到 plPython 函数中,用 io.BytesIO() 替换文件 - 或者任何最适合无缝插入的机制...

文件 read/writes 现在将保存到 PostgreSQL bytea cols。文档 'in' 已使用 PG 复制功能编写 - 字节数与磁盘大小相匹配;到目前为止一切顺利。

原始代码预期文件:

# infile = "myInputPdf.pdf"
# outfile = "myOutputPdf.pdf"

# inputStream  = open(infile, "rb")  # designed to open OS-based file
# --- Instead: 'document_in' loaded from PG bytea col:
inputStream = io.BytesIO(document_in)
# ---
pdf_reader = PdfFileReader(inputStream, strict=False)
# (lots of code in here, seems? to be working)
outputStream = io.BytesIO()   # trying it the python3 way!
pdf_writer.write(outputStream)

(我假设对象应该被视为字节对象)

最后:

plan3 = plpy.prepare("UPDATE documents SET document_out= WHERE name=", ["varchar"]["varchar"])
ERROR:  TypeError: list indices must be integers, not str

(PostgreSQL 11.1,如果重要的话)

过去使用 mkstemp 技术做过类似的事情;现在正努力成长为字节世界!

plpy.prepare() 中的第二个参数是一个列表。列类型是 bytea,而不是 varchar。你应该使用 bytes (不是文件对象)来更新列:

plan3 = plpy.prepare("UPDATE documents SET document_out= WHERE name=", ["varchar", "bytea"])
outputStream.seek(0)
bytes_out = outputStream.read()
plpy.execute(plan3, ['some name', bytes_out])