Я пытаюсь получить данные blob из oracle в текстовый файл с помощью Python. Я не мог найти ответ ни на одну из других ссылок.
Ниже мой код:
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
Я пробовал несколько других способов, но проблема в том, что даже другие подходы, которые я видел, обрабатывают только строки, а не капли.
Вы должны использовать метод cx_oracle.LOB.read()
для получения содержимого объекта LOB
:
f.write(row[2].read())
Если ваши большие объекты достаточно малы, чтобы вписаться в память, вы получите лучшую производительность, если вы получите 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)
См. Пример cx_Oracle на странице https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py
Реализовано то, что предложил @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()
str
. Попробуйтеrow[2].read()