【问题标题】:Write a series of SQL queries to single csv in python在python中将一系列SQL查询写入单个csv
【发布时间】:2016-09-14 19:05:45
【问题描述】:

基本上我想从几个 SQL 查询中创建一个 csv 文件。到目前为止我所拥有的:

import pyodbc
import csv
import itertools

conn = pyodbc.connect("user")
cur = conn.cursor()

sql_queries = ['query_1', 'query_2', 'query_3']
columns = []
rows = []
for query in sql_queries:
    cur.execute(query)
    columns.append([i[0] for i in cur.description])
    rows.append(cur.fetchall())
flat_columns = list(itertools.chain.from_iterable(columns))

fp = open('temp_file.csv', 'w')
my_file = csv.writer(fp)
my_file.writerow(flat_columns)
for row in rows:
    my_file.writerows(row)
fp.close()

flat_columns 在顶部正确打印各种查询的所有列标题,但随后按顺序打印行(即,不在正确标题下,第一个查询除外)。有没有办法让它们在适当的标题下水平排列?查询产生不同数量的行和列。

编辑 例如,假设 query1 产生 2 列(headers1-2),而 query2 和 query3 分别产生 1 列(分别是 header3 和 header4),其中 query1 产生形式为“xx”、query2 为“yy”和 query3 为“zz”的结果。这是我目前得到的:

header1  header2  header3  header4  
xx       xx       
xx       xx
xx       xx
yy
yy
zz

这就是我想要的:

header1  header2  header3  header4
xx       xx        yy      zz
xx       xx        yy
xx       xx

【问题讨论】:

  • 如果能看到一些当前和期望结果的数据,那真是太好了。
  • 添加了一些插图
  • 您能否在本地保存数据之前放入print 语句,并向我们展示为flat_columns 打印的内容。基本上是print(flat_columns),然后再保存。
  • flat_columns 只是所有查询的标题名称的一维列表:['header1', 'header2', 'header3', 'header4']
  • rows 中有什么内容?格式是什么?

标签: python sql csv


【解决方案1】:

这个答案假设变量 rows 包含一个像 [[('xx', 'xx'), ('xx', 'xx'), ('xx', 'xx')], [('yy',), ('yy',)], [('zz',)]] 这样的元组列表,并且您正在使用 Python2

from itertools import izip_longest

rows = [[('xx', 'xx'), ('xx', 'xx'), ('xx', 'xx')], [('yy',), ('yy',)], [('zz',)]]
final_rows = map(lambda x: reduce(lambda y,z: y+z,x),list(izip_longest(*rows, fillvalue=(None,))))

with open('temp_file.csv', 'w') as outfile:
    writer = csv.writer(outfile, delimiter = "\t")
    writer.writerow(flat_columns)
    writer.writerows(final_rows)

输出:

header1 header2 header3 header4
xx      xx      yy      zz
xx      xx      yy      
xx      xx              

注意: 如果您希望使用 Python3,您可能希望将 map 函数的输出包裹在 list() 周围,以及 import zip_longest 而不是 izip_longest

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2015-02-13
    • 2014-02-23
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多