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

时间:2019-01-02 21:57:59

标签: python python-3.x postgresql plpython

具有经过测试的漂亮的python PyPDF2代码,一个.py旨在在“真实” OS文件上运行。完成所有调试之后,我现在尝试将其合并到plPython函数中,用io.BytesIO()替换文件-或采用任何机制将是无缝插入的最佳选择...

文件读/写现在将通过tea cols发送到PostgreSQL。 “ 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=$2 WHERE name=$1", ["varchar"]["varchar"])
ERROR:  TypeError: list indices must be integers, not str

(如果需要的话,是PostgreSQL 11.1)

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

1 个答案:

答案 0 :(得分:2)

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

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