2016-09-14 8 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を使用したい場合は、あなたがlist()周りmap関数の出力をラップしたい、ともimport zip_longest代わりizip_longestのこと。

こちらがお役に立てば幸いです。

関連する問題