Python调用SQLPlus查询Oracle导出规范CSV文件的问题求助
问题修复方案
核心错误原因
- 语法错误:header定义中
CITY未加字符串引号,会触发Python变量未定义报错 - SQLPlus配置冲突:同时设置
SET MARKUP CSV ON和SET colsep ,会导致输出格式混乱;SET linesize 2设置过小,会强制截断拆分行 - 查询结构不匹配:两个SELECT语句返回列数分别为3列和1列,无法合并到同一个3列表头的CSV文件中
- CSV写入逻辑错误:同时初始化两个不同分隔符的writer导致格式混乱;直接将完整的多行字符串传入
writerow,csv.writer会将每个字符识别为单独列,才会出现单字母拆分到不同列的问题
可行修改方案
调整后的完整代码(保留单条多列查询逻辑,适配Excel打开)
import subprocess from subprocess import Popen, PIPE import csv def run_sqlplus(sql_command, connect_string): session = Popen(['sqlplus','-S', connect_string], stdin=PIPE, stdout=PIPE, stderr=PIPE) (stdoutbytes, stderrbytes) = session.communicate(sql_command.encode('utf-8')) return (stdoutbytes.decode('utf-8'), stderrbytes.decode('utf-8')) # 修正语法错误,给CITY加引号 header = ['NAME','AGE','CITY'] usr_file = 'Test.csv' connect_string = 'user/pass@MYDB' # 修正SQLPlus配置,删除冲突设置,调整合理参数 sql_command = """ SET HEADING OFF SET colsep , SET pagesize 0 SET linesize 1000 SET numwidth 5 SET trimspool ON SET feedback OFF SELECT name,age,city from accounts where age > 50; """ query_result = run_sqlplus(sql_command, connect_string) # 处理返回结果:按行拆分,去除空行,按逗号分割字段 result_rows = [] for line in query_result[0].splitlines(): line = line.strip() if line: # 按逗号拆分字段,去除每个字段前后的空格 fields = [f.strip() for f in line.split(',')] result_rows.append(fields) with open(usr_file, 'w', encoding='utf-8-sig', newline='') as csvfile: # 只用一个writer,用逗号分隔符Excel可直接识别,加utf-8-sig编码避免中文乱码 writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) writer.writerow(header) writer.writerows(result_rows)
额外说明
如果需要保留两条查询的结果,建议分开导出到两个不同的CSV文件,避免列数不匹配导致的格式混乱。如果一定要合并到同一个文件,需要调整第二条查询的字段,补充两个空值占位,保证每行都是3列结构。
内容的提问来源于stack exchange,提问作者Mark T
相关产品推荐
相关产品推荐

