You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:33:48