基本上我想从几个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
答案 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
。
我希望这会有所帮助。