Oracle表Python脚本导出优化:仅生成含CSV的压缩包及列存储疑问
搞定Oracle数据导出压缩CSV的两个问题
嘿,针对你遇到的两个问题,我整理了具体的解决办法和修改后的脚本,一起来看看:
问题1:只生成压缩包,不留下单独的CSV文件
你当前的脚本是先创建本地CSV文件再压缩,所以会残留临时文件。这里有两种方案:
方案1:简单粗暴——压缩后删除临时文件
在脚本最后加上一行删除文件的代码就行,不过这种方式还是会短暂生成本地文件:
os.remove(filename)
方案2:优雅无临时文件——内存中直接生成CSV并打包(推荐)
用io.StringIO在内存里处理CSV内容,完全不生成本地文件,更干净:
问题2:所有数据挤在CSV同一列
先看你的原脚本,发现个致命小错误:打开文件时用了'r'只读模式!这根本没法写入数据啊,这大概率就是数据格式乱掉的原因。另外,也得确保CSV的分隔符设置正确。
整合后的完整可用脚本
import os import cx_Oracle import csv import zipfile from io import StringIO # 建立数据库连接 connection = cx_Oracle.connect('dbconnection') SQL = "SELECT * FROM AIR_CONDITIONS_YEARLY_MVIEW ORDER BY TIME" zip_filename = "sample.zip" cursor = connection.cursor() cursor.execute(SQL) # 内存中生成CSV内容,不用写本地文件 csv_buffer = StringIO() writer = csv.writer(csv_buffer) # 写入表头(取字段名) writer.writerow([col[0] for col in cursor.description]) # 批量写入数据行 writer.writerows(cursor.fetchall()) # 直接把内存中的CSV写入压缩包 with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as air_zip: # 指定压缩包内的文件名是sample.csv air_zip.writestr("sample.csv", csv_buffer.getvalue()) # 关闭所有资源 cursor.close() connection.close() csv_buffer.close()
关键修改点解释
- 替换本地文件为
StringIO内存缓冲区,全程在内存操作,无临时文件残留 - 修复了原脚本中
open(filename, 'r')的错误(只读模式根本写不了数据) - 用
zipfile的writestr方法直接把内存里的CSV内容打包,省掉了创建本地文件的步骤 - 用
with语句管理压缩包,自动关闭资源,比手动close()更安全可靠
额外:如果数据还是挤在一列怎么办?
要是修复后还是有列合并的问题,可能是这两个原因:
- 你的数据里包含逗号,CSV默认用逗号当分隔符,导致列被拆分合并。可以换个分隔符,比如制表符:
writer = csv.writer(csv_buffer, delimiter='\t') - 某些字段包含换行符、引号这类特殊字符,需要提前处理这些字符再写入CSV
内容的提问来源于stack exchange,提问作者str8nomore
相关产品推荐
相关产品推荐

