如何用Python从OracleDB获取的octet-stream生成原始文件?
问题分析
你的代码核心问题是错误地将二进制数据的字符串表示当成了原始二进制内容写入文件:
fetchall()返回的是包含二进制数据的元组列表,你将其转为字符串后截取,相当于把b'xxx'这种字符串形式当成了数据,而非实际的字节流。- 不必要地将所有类型都转为
LONG_RAW,可能干扰原始数据的读取。
修正方案
以下是修复后的代码,直接读取原始二进制数据并写入文件:
import oracledb oracledb.init_oracle_client(lib_dir=r"C:\instantclient_21_6") dsn_tns = oracledb.makedsn('xxx', 3333, service_name='XXX') conn = oracledb.connect(user='xxx', password='xxx', dsn=dsn_tns) # 仅针对BLOB类型做处理(如果你的DATA字段是BLOB),其他类型保持默认 def output_type_handler(cursor, name, default_type, size, precision, scale): if default_type == oracledb.DB_TYPE_BLOB: return cursor.var(oracledb.DB_TYPE_LONG_RAW, arraysize=cursor.arraysize) return None conn.outputtypehandler = output_type_handler c = conn.cursor() c.execute(''' SELECT "DATA" FROM "ZITSMSCHUL"."SYSATTACHMEM1" WHERE "TOPIC" ='IM28588' ''') res = c.fetchall() # 提取第一条记录的原始二进制数据(多结果可循环处理) if res: raw_data = res[0][0] filePath = 'C:/Users/123/Desktop/37505_ping.doc' with open(filePath, 'wb') as f: f.write(raw_data) c.close() conn.close()
关键修正点
- 移除了将查询结果转为字符串的错误操作,直接提取原始字节数据
res[0][0] - 简化
output_type_handler,仅针对BLOB字段处理(若DATA是RAW/LONG RAW类型,可直接删除该handler) - 使用
'wb'模式写入文件,直接写入原始字节流,无需额外编码转换
内容的提问来源于stack exchange,提问作者TryZ
相关产品推荐
相关产品推荐

