Ich habe eine CSV-Datei und möchte diese Datei mithilfe von Python in meine SQLite3-Datenbank importieren. Der Befehl lautet ".import .....". aber es scheint, dass es so nicht funktionieren kann. Kann mir jemand ein Beispiel geben, wie es in sqlite3 geht? Ich benutze Windows nur für den Fall. Vielen Dank
105
Antworten:
quelle
not all arguments converted during string formatting
wenn ich diese Methode versuche.Das Erstellen einer SQLite-Verbindung zu einer Datei auf der Festplatte bleibt dem Leser als Übung überlassen. Die Pandas-Bibliothek ermöglicht jetzt einen zweizeiligen Vorgang
quelle
df
also verkürzte ich Ihr Beispiel auf:pandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
Meine 2 Cent (allgemeiner):
quelle
Der
.import
Befehl ist eine Funktion des Befehlszeilentools sqlite3. Um dies in Python zu tun, sollten Sie die Daten einfach mit den von Python bereitgestellten Funktionen wie dem CSV-Modul laden und die Daten wie gewohnt einfügen.Auf diese Weise haben Sie auch die Kontrolle darüber, welche Typen eingefügt werden, anstatt sich auf das scheinbar undokumentierte Verhalten von sqlite3 zu verlassen.
quelle
quelle
Vielen Dank für Bernies Antwort ! Musste es ein bisschen optimieren - hier ist, was für mich funktioniert hat:
Meine Textdatei (PC.txt) sieht folgendermaßen aus:
quelle
Sie haben Recht, das
.import
ist der richtige Weg, aber das ist ein Befehl aus der SQLite3.exe-Shell. Viele der häufigsten Antworten auf diese Frage betreffen native Python-Schleifen. Wenn Ihre Dateien jedoch groß sind (meine sind 10 ^ 6 bis 10 ^ 7 Datensätze), möchten Sie vermeiden, alles in Pandas einzulesen oder ein natives Python-Listenverständnis / eine native Python-Listenschleife zu verwenden (obwohl ich sie nicht zum Vergleich zeitlich festgelegt habe).Für große Dateien ist es meiner Meinung nach die beste Option, die leere Tabelle im Voraus zu erstellen
sqlite3.execute("CREATE TABLE...")
, die Header aus Ihren CSV-Dateiensubprocess.run()
zu entfernen und dann die Importanweisung von sqlite auszuführen. Da der letzte Teil meiner Meinung nach der relevanteste ist, werde ich damit beginnen.subprocess.run()
Erläuterung
In der Befehlszeile suchen Sie nach dem Befehl
sqlite3 my.db -cmd ".mode csv" ".import file.csv table"
.subprocess.run()
führt einen Befehlszeilenprozess aus. Das Argument tosubprocess.run()
ist eine Folge von Zeichenfolgen, die als Befehl interpretiert werden, gefolgt von allen Argumenten.sqlite3 my.db
öffnet die Datenbank-cmd
Mit flag nach der Datenbank können Sie mehrere Folgebefehle an das SQLite-Programm übergeben. In der Shell muss jeder Befehl in Anführungszeichen stehen, aber hier müssen sie nur ihr eigenes Element der Sequenz sein'.mode csv'
tut, was Sie erwarten würden'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'
ist der Importbefehl.Da der Unterprozess alle Folgemaßnahmen
-cmd
als Zeichenfolgen in Anführungszeichen übergibt , müssen Sie Ihre Backslashes leider verdoppeln, wenn Sie einen Windows-Verzeichnispfad haben.Header entfernen
Nicht wirklich der Hauptpunkt der Frage, aber hier ist, was ich verwendet habe. Auch hier wollte ich zu keinem Zeitpunkt die gesamten Dateien in den Speicher lesen:
quelle
Basierend auf der Guy L-Lösung (Love it), kann jedoch maskierte Felder verarbeiten.
quelle
Sie können dies mit
blaze
&odo
effizient tunOdo speichert die CSV-Datei in
data.db
(SQLite-Datenbank) unter dem Schemadata
Oder Sie verwenden
odo
direkt, ohneblaze
. In beiden Fällen ist alles in Ordnung. Lesen Sie diese Dokumentationquelle
Wenn die CSV-Datei als Teil eines Python-Programms importiert werden muss, können Sie sie der Einfachheit und Effizienz halber wie
os.system
folgt verwenden:Der Punkt ist, dass durch Angabe des Dateinamens der Datenbank die Daten automatisch gespeichert werden, vorausgesetzt, es gibt keine Fehler beim Lesen.
quelle
quelle
Der Einfachheit halber können Sie das Befehlszeilentool sqlite3 aus dem Makefile Ihres Projekts verwenden.
make test.sql3
Anschließend wird die SQLite-Datenbank aus einer vorhandenen Datei test.csv mit einer einzelnen Tabelle "test" erstellt. Sie können dannmake test.dump
den Inhalt überprüfen.quelle
Ich habe festgestellt, dass es notwendig sein kann, die Übertragung von Daten von der CSV zur Datenbank in Blöcken aufzuteilen, damit nicht der Speicher ausgeht. Dies kann folgendermaßen geschehen:
quelle