2016-09-14 17 views
0

基本上我想從幾個SQL查詢創建一個csv文件。我至今:在python中爲單個csv編寫一系列SQL查詢

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正確打印在上面的各種查詢的所有列標題,但隨後行打印順序(即不正確的頭下,除第一個查詢)的。有沒有辦法讓它們在適當的標題下水平排列?查詢產生不同數量的行和列。

EDIT 例如,讓我們說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 
+0

看到一些數據是當前和期望的結果,真的很不錯。 – Parfait

+0

添加了一些插圖 – user3059201

+0

您可以在將數據保存到本地之前放置'print'語句,並向我們展示爲'flat_columns'打印的內容。基本上'print(flat_columns)'在你保存之前。 – Abdou

回答

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) 

輸出工作

注: 如果你想使用Python3,你可能要包裹map函數的輸出周圍list(),也import zip_longest,而不是izip_longest

我希望這會有所幫助。