【问题标题】:Converting multiple blobs to pdf将多个 blob 转换为 pdf
【发布时间】:2019-08-19 16:54:32
【问题描述】:

我有多个 28K 字节大小的 blob 块,除了最后一个可以相同或更少。 x.pdf 有 94 个块。代码循环通过 94 个块并没有错误地结束。任何人都使用多个 blob 来创建单个文件。

已经使用 PL/SQL 创建了 275K 文件,现在卡住了大约 4K,这对于 UTL_FILE 函数来说似乎太大了。

con = cx_Oracle.connect('sysadm/password@mydb')

cur = con.cursor() 
sql = 'select count(*) from chunk_record where filename = :sfn'
cur.execute(sql, sfn = 'x.pdf')
z = cur.fetchone()[0]
y = 0
with codecs.open('x.pdf', encoding='utf-8', mode='wb+') as file:
    bcur = con.cursor()
    for y in range (z):
        print(y)
        bsql = 'select file_data from chunk_record where filename = :sfn and file_seq = :seq'
        bcur.execute(bsql, sfn = 'x.pdf', seq = y)
        if type(bcur.fetchone()[0]) is cx_Oracle.BLOB:
             file.write(bcur.fetchone()[0].read())
    bcur.close()
file.close()
cur.close()
con.close()

下面的 python 代码正在生成大小为零的 x.pdf。当我尝试以 pdf 格式打开时,它会出错。大小应在 28K*93 ~ 28K*94 之间

【问题讨论】:

  • 你试过调试你的代码吗?您可以尝试先将写入文件的内容打印到 STDOUT,这将确保您从 SQL 连接中获取数据,
  • 能否请您发布错误信息?

标签: python file pdf blob cx-oracle


【解决方案1】:

条件type(row[0]) is cx_Oracle.BLOB 始终为假。因为cx_Oracle.BLOB 是结果中出现的列类型 设置描述,但类是cx_Oracle.LOB,所以改为检查:

row = bcur.fetchone()
if isinstance(row[0], cx_Oracle.LOB):
    file.write(row[0].read())

文件最终为空的原因是它从未被写入。

其余的答案都是正确的。


为什么要使用编码打开文件?它应该是不应转码的二进制数据。

替换with codecs.open('x.pdf', encoding='utf-8', mode='wb+') as file:

with open('x.pdf', mode='wb+') as file:

【讨论】:

  • Dan D 那是我的原始代码,它不起作用,所以我改为编解码器。您对 cx_oracle 对象是正确的,但实际问题是需要多个 blob 属性“a”
【解决方案2】:

with open('x.pdf', mode='a') as file:

将 wb+ 更改为 a 解决了问题,谢谢。

【讨论】:

  • 这解决了部分问题意味着代码在 blob 写入之间打开和关闭文件,这是我的问题代码没有做的事情。
  • 我不确定我是否理解您的观点。该文件打开和关闭一次。 'a' 进行追加。 Python 文档对此进行了解释。还是我错过了什么?
猜你喜欢
  • 2020-07-12
  • 2022-12-26
  • 2019-06-04
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多