使用 python 从 Oracle 到文本文件的 Blob 数据
Blob data from Oracle to text file using python
我一直在尝试使用 Python 将 blob 数据从 oracle 获取到文本文件中。我在任何其他链接上都找不到答案。
下面是我的代码:
sql_string = """select
event_id
,blob_length
,blob field
from table"""
cur.execute(sql_string)
path = "P:/Folders/"
for row in cur:
filename = path + "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"
f = codecs.open(filename, encoding='utf-8', mode='wb+')
f.write(row[2])
f.close()
我收到以下错误
TypeError: utf_8_encode() argument 1 must be str, not cx_Oracle.LOB
我尝试了其他几种方法,但问题是即使是我见过的其他方法也只能处理字符串而不是 blob。
你必须使用cx_oracle.LOB.read()
方法来获取LOB
对象的内容:
f.write(row[2].read())
实施了@blhsing 的建议,结果非常完美
for row in cur:
filename = path + "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"
print(row[2].read())
f = open(filename, "wb")
f.write(row[2].read())
f.close()
如果您的 LOB 足够小以适合内存,如果您将 BLOB 获取为 LONG_BINARY(并使用 LONG_STRING 获取 CLOB),您将获得更好的性能:
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
if defaultType == cx_Oracle.BLOB:
return cursor.var(cx_Oracle.LONG_BINARY, arraysize = cursor.arraysize)
请参阅 https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py
中的 cx_Oracle 示例
我一直在尝试使用 Python 将 blob 数据从 oracle 获取到文本文件中。我在任何其他链接上都找不到答案。
下面是我的代码:
sql_string = """select
event_id
,blob_length
,blob field
from table"""
cur.execute(sql_string)
path = "P:/Folders/"
for row in cur:
filename = path + "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"
f = codecs.open(filename, encoding='utf-8', mode='wb+')
f.write(row[2])
f.close()
我收到以下错误
TypeError: utf_8_encode() argument 1 must be str, not cx_Oracle.LOB
我尝试了其他几种方法,但问题是即使是我见过的其他方法也只能处理字符串而不是 blob。
你必须使用cx_oracle.LOB.read()
方法来获取LOB
对象的内容:
f.write(row[2].read())
实施了@blhsing 的建议,结果非常完美
for row in cur:
filename = path + "notes_" + str(row[0]) + "_" + str(row[1]) + ".txt"
print(row[2].read())
f = open(filename, "wb")
f.write(row[2].read())
f.close()
如果您的 LOB 足够小以适合内存,如果您将 BLOB 获取为 LONG_BINARY(并使用 LONG_STRING 获取 CLOB),您将获得更好的性能:
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
if defaultType == cx_Oracle.BLOB:
return cursor.var(cx_Oracle.LONG_BINARY, arraysize = cursor.arraysize)
请参阅 https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py
中的 cx_Oracle 示例