在python中向单个csv写一系列SQL查询

时间:2016-09-14 19:05:45

标签: python sql csv

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/fresco_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

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

修改 例如,假设query1产生2列(headers1-2),query2和query3各产生1列(分别为header3和header4),其中query1产生形式'xx',query2'yy'和query3'zz'的结果。这就是我目前所得到的:

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()

这就是我想要的:

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

1 个答案:

答案 0 :(得分:0)

这个答案假设变量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

我希望这会有所帮助。