通过python从数据库中读取blob数据并以.zip格式存储

问题描述 投票:0回答:2

您好,我正在尝试使用 python 存储来自我的 oracle 数据库的 blob 数据,并尝试将其以 .zip 格式存储在本地文件夹中。所以我现在有两个代码,其中一个运行良好但只获取一行并将其作为 .zip 存储在一个文件夹中,但另一个我试图获取多行,但不起作用,可能我正在做一些基本的错误,但无法弄清楚,所以请帮助我。以下是代码:-

代码 1-运行良好,仅获取一行并将其作为 .zip 存储在文件夹中:-

import cx_Oracle
import numpy as np
import pandas as pd
con = cx_Oracle.connect("OPTDB90", "OPTDB90", "INDLIN2338:1521/OPTEPC1")
cursor = con.cursor()
sql_string = """SELECT F_name, F_released_data FROM epc_project where rownum<5"""
cursor.execute(sql_string)
#Path="C:\Users\adityasi\Desktop\MY Important\QueryGeneratorPytthonFinal\Project\EPCPROJECTS"
row = cursor.fetchone()
blobdata = np.array(row[1].read())
cursor.close()
filename = str(row[0]) + ".zip"
f = open(filename, 'w+b')
binary_format = bytearray(blobdata)
f.write(binary_format)
f.close()

代码 2-抛出错误,无法获取多行并将其作为 .zip 存储在文件夹中:-

import cx_Oracle
import numpy as np
import pandas as pd
con = cx_Oracle.connect("OPT", "OPT", "INDLIN2338:1521/OPT1")
cursor = con.cursor()
sql_string = """SELECT F_name, F_released_data FROM epc_project where rownum<5"""
cursor.execute(sql_string)
rows = cursor.fetchall()
for row in rows:
        blobdata= np.array(row[1].read())
        cursor.close()
        filename =str(row[0]) + ".zip"
con.close()
f = open(filename, "wb")
binary_format = bytearray(blobdata)
f.write(binary_format)
f.close()

错误:-

     blobdata= np.array(row[1].read())
AttributeError: 'str' object has no attribute 'read'

Process finished with exit code 1

请帮帮我。 谢谢, 阿迪亚

python oracle blob cx-oracle
2个回答
0
投票

我不确定是否需要使用 numpy,但在任何情况下您都有几个选择:

(1) 使用输出类型处理程序确保 LOB 数据直接作为字节返回,而不是作为必须调用 read() 的 BLOB。有关如何执行此操作的详细信息,请参阅文档

(2) 遍历游标并分别处理每一行,如:

cursor.execute(sql_string)
for name, data in cursor:
    create_zip_file()

-1
投票

试试这个)

cursor = conn.cursor()
sql_string = 'select id, photo from NEO_V '
row = cursor.execute(sql_string)
img_name, img_file = cursor.fetchone()
path = 'C:\\ii\\bever_31_005\\dataset\\'
mask = ".jpg"
for rows in row:
    #blobdata= np.array(row[1].read())
    filename = f'{path}{str(rows[0])}{mask}'
    #print (filename)
    offset = 1
    num_bytes_in_chunk = 65536
    with open(filename, "wb") as f:
        while True:
            data = rows[1].read(offset, num_bytes_in_chunk)
            if data:
                f.write(data)
            if len(data) < num_bytes_in_chunk:
                break
            offset += len(data)
    f.close() 
conn.close()
© www.soinside.com 2019 - 2024. All rights reserved.