BLOB-данные из Oracle в текстовый файл с использованием Python

1

Я пытаюсь получить данные 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

Я пробовал несколько других способов, но проблема в том, что даже другие подходы, которые я видел, обрабатывают только строки, а не капли.

  • 0
    Вы должны прочитать данные LOB в str . Попробуйте row[2].read()
Теги:

3 ответа

1
Лучший ответ

Вы должны использовать метод cx_oracle.LOB.read() для получения содержимого объекта LOB:

f.write(row[2].read())
  • 1
    Огромное спасибо!!
1

Если ваши большие объекты достаточно малы, чтобы вписаться в память, вы получите лучшую производительность, если вы получите 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

  • 0
    Спасибо Кристофер. Я просто читал комментарии, и там говорится, что этот метод требует непрерывной памяти, поэтому его нельзя использовать для очень больших больших объектов. И я уже сталкиваюсь с проблемой с большими каплями. И я пытался записать в текстовые файлы, чтобы я мог распаковать весь большой двоичный объект, что в настоящее время я не могу сделать с кадрами данных или текстовым файлом. stackoverflow.com/questions/51922686/… Любая помощь / предложения будут великолепны!
1

Реализовано то, что предложил @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()        

Ещё вопросы

Сообщество Overcoder
Наверх
Меню