使用python从Oracle到文本文件的Blob数据

时间:2018-08-16 00:29:03

标签: python oracle blobs

我一直在尝试使用Python将oracle的blob数据转换为文本文件。我在其他任何链接上都找不到答案。

下面是我的代码:

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。

3 个答案:

答案 0 :(得分:1)

您必须使用cx_oracle.LOB.read()方法来获取LOB对象的内容:

f.write(row[2].read())

答案 1 :(得分: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()        

答案 2 :(得分:1)

如果您的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示例