2016-03-23 9 views
0

からCSVファイルをエクスポート:答えはそこにすでに</p> <p>である場合、これは私がこれまで持っているもので申し訳ありませんが、私は今、時間のためにこれをGoogleにしようとしてきたPythonのsqlite3の

c.execute("SELECT * FROM table") 
table = c.fetchall() 
print(table) 

#to export as csv file 
with open("wub.csv", "wb") as write_file: 
    cursor = connection.cursor() 
      for row in cursor.execute("SELECT * FROM table"): 
      write_file.write(row) 

しかし、私

Traceback (most recent call last): 
    File "C:/Users/Rachel/Documents/database.py", line 52, in <module> 
    write_file.write(row) 
TypeError: a bytes-like object is required, not 'tuple' 

だから私は間違っているとは思っていますが、正しく表を外部のCSVファイルにエクスポートするとどうなりますか? to Janekmuric

+1

'write_file.write("、 "。join(row))'はそれを修正しますか?たぶん 'write_file.write("、 "。自動的に改行を追加しない場合は、 '' join(row)+ "\ n")を実行します。とにかく、@ cricket_007のリンクが示唆するように、csvファイルを扱うモジュールもあります – jDo

+0

警告:Python3を使用していて、バイナリモードで.cvsファイルを書きたい場合は、sqliteから返された文字列をエンコードする必要がありますカーソルをバイトに置き換えます。 –

答えて

0

以下のコードは、タプルのリストを反復処理するようなことSELECTexecute)を返す:あなた

EDITをありがとうございます。

for row in cursor.execute("SELECT * FROM table"): 
     write_file.write(row) 

例:
あなたが行numberwordでデータベースを持っている場合は、colourあなたのコードがします。このような何かをループ:

(23, "tree", "red") 
(17, "code", "green") 
(11, "python", "yellow") 

そして、あなたが何をしようとしていると、ファイルにタプルを書きです。文字列(またはbytes)のみをファイルに書き込むことができます。

あなたがしなければならないことは、そのタプルを文字列に変換することです。このためにはjoin()機能を使用できます。

あなたのコードは次のようになります:

c.execute("SELECT * FROM table") 
table = c.fetchall() 
print(table) 

#to export as csv file 
with open("wub.csv", "wb") as write_file: 
    cursor = connection.cursor() 
    for row in cursor.execute("SELECT * FROM table"): 
      writeRow = " ".join(row) 
      write_file.write(writeRow) 

" ".join(row)は、すべてのタプルの要素を結合し、この場合、空間に、とそれらを区切るます。


これにはいくつか問題があります。

は、あなただけの各要素の上に行くループを書くことができます

(データベースがREALまたはINTEGERタイプを持っていたので、もし上記のコードは動作しません)のみだけで文字列要素が含まれているリストやタプルで動作参加しますリスト内の文字列に変換します。

"rb"でCSVファイルを開いているので、ファイルに書き込む前にbytesに変換する必要があるため、.encode()も追加しました。

c.execute("SELECT * FROM table") 
table = c.fetchall() 
print(table) 

#to export as csv file 
with open("wub.csv", "wb") as write_file: 
    cursor = connection.cursor() 
    for row in cursor.execute("SELECT * FROM table"): 
     writeRow = " ".join([str(i) for i in row]) 
     write_file.write(writeRow.encode()) 
+0

あなたの返事には本当に感謝していますが、私のテーブルには複数の 'フィールドタイプ'があります(実際の記述方法はわかりません)。CSVファイルにはすべてのデータが1つのフィールドに入っていますスクリーンショットでは質問の部分に) - 1つのテーブルフィールドに1つのExcelフィールドが割り当てられ、各エントリが別の行に表示されるようにする方法がありますか? – Rachel

+0

@レイチェル何を求めているのか分かりません。コード全体をアップロードして、必要なものの詳細を追加するといいでしょう。また、この回答に合格とマークして新しい質問を投稿することもできます。 – Janekmuric

1
import sqlite3 
import csv 

inpsql3 = sqlite3.connect('input.sql3') 
sql3_cursor = inpsql3.cursor() 
sql3_cursor.execute('SELECT * FROM clients') 
with open('output.csv','wb') as out_csv_file: 
    csv_out = csv.writer(out_csv_file) 
    # write header       
    csv_out.writerow([d[0] for d in sql3_cursor.description]) 
    # write data       
    for result in sql3_cursor: 
    csv_out.writerow(result) 
inpsql3.close() 

clientsテーブルのヘッダーの名前を取得するには、SQLカーソルのdescriptionメンバーの使用に注意してください。

もちろん、入力ファイルと出力ファイルの名前を変更できます。また、csv.writerのパラメータを変更することもできます。

関連する問題

 関連する問題