2016-03-23 10 views
0

Ich habe versucht, dies jetzt stundenlang Google, sorry, wenn die Antwort bereits aus ist esExportieren von CSV-Datei aus Python Sqlite3

Das ist, was ich bisher habe:

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) 

Aber ich halten einen Fehler bekommen:

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' 

so bin ich ziemlich sicher, dass ich alles falsch -wie tun würde ich die Tabelle an eine externe CSV-Datei ordnungsgemäß exportieren? Danke

EDIT: to Janekmuric

+1

Schreibt 'write_file.write (", ". Join (row))' fix it? Vielleicht 'write_file.write (", ".Join (Zeile) + "\ n") 'falls es nicht automatisch einen Zeilenumbruch hinzufügt. Wie auch immer, wie der @ cricket_007-Link vermuten lässt, gibt es auch ein Modul für den Umgang mit csv-Dateien. – jDo

+0

Warnung: Wenn Sie Python3 verwenden und die .cvs-Datei im Binärmodus schreiben möchten, müssen Sie die von sqlite zurückgegebenen Strings kodieren Cursor zu Bytes. –

Antwort

0

Der folgende Code wird eine Liste von Tupeln iterieren, dass SELECT (execute) kehrt zurück.

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

ZB.
Wenn Sie eine Datenbank mit Zeilen number haben, word, colour Ihr Code wird eine Schleife über etwas wie folgt aus:

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

Und was Sie versuchen zu tun ist, schreiben einen Tupel in einer Datei. Sie können nur Zeichenfolgen (oder bytes) in eine Datei schreiben.

Was Sie tun müssen, ist das Tupel in eine Zeichenfolge zu konvertieren. Dazu können Sie die join() Funktion verwenden.

Ihr Code sieht nun wie folgt aus:

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) alle Tupelelemente verbinden und trennen sie mit, in diesem Fall einem Raum.


Es gibt ein paar Probleme damit.

Join funktioniert nur mit Listen und Tupeln, die nur Textelemente enthalten (so dass der Code oben würde nicht funktionieren, wenn Ihre Datenbank einen REAL oder INTEGER Typen hat)

Sie können nur eine Schleife schreiben, die über jedes Element geht in der Liste und konvertiert es in eine Zeichenfolge.

Ich habe auch eine .encode() hinzugefügt, weil Sie Ihre CSV-Datei mit "rb" öffnen, so dass Sie es in bytes vor dem Schreiben in die Datei konvertieren müssen.

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

Vielen Dank für Ihre Antwort - das hat funktioniert, aber meine Tabelle hat mehr als eine Art von Feld (nicht wirklich sicher, wie es zu beschreiben ist), und die CSV-Datei enthält alle Daten in einem Feld (ich werde bearbeiten in einem Screenshot in die Frage Teil) gibt es eine Möglichkeit, es zu bekommen, so dass ein Tabellenfeld ein Excel-Feld zugeordnet ist, und jeder Eintrag in einer anderen Zeile ist? – Rachel

+0

@Rachel Ich bin mir nicht sicher, was du fragst. Es wäre schön, wenn Sie den gesamten Code hochladen und weitere Details zu Ihren Anforderungen hinzufügen könnten. Sie können diese Antwort auch als akzeptiert markieren und eine neue Frage stellen. – 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() 

Beachten Sie die Verwendung von description Mitglied der SQL-Cursor, den Namen der Header in dem clients Tisch zu bekommen.

Sie können natürlich die Namen der Eingabe- und Ausgabedateien ändern. Und Sie können auch die Parameter des csv.writer ändern.