Problem mit "LOAD DATA INFILE"-Befehl

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Caldar
User
Beiträge: 46
Registriert: Sonntag 17. Mai 2009, 18:20

Ich versuche gerade, csv-files mittels dem LOAD DATA INFILE-Befehl (MySQL) in eine Tabelle einzulesen.
Das klappt auch ganz gut mit einem vorhandenen csv-File, welches ich vor ein paar Tagen generiert habe.
Ich habe nun ein zweites csv-File zum Testen erstellt und am gleichen Ort gespeichert.
Aber hier bekomme ich aber immer einen

Code: Alles auswählen

_mysql_exceptions.InternalError: (29, "File 'D:\test.csv' not found (Errcode: 22)")
-Fehler
Das funktionierende Code in Python sieht so aus:

Code: Alles auswählen

import MySQLdb

conn = MySQLdb.connect("localhost", "root", db="abc")
curs = conn.cursor()
sql = """LOAD DATA INFILE "D:\\test.csv" INTO TABLE test"""
curs.execute(sql)
Wenn ich nun den identischen Code nehme und statt file.csv die neu erstellte test.csv einfüge, bringt er mir obigen Fehler. Wie kann das sein?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Eventuell bekommst du statt \t im Dateinamen ein Tab, weil das eine Escape-Sequenz ist...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um das einzelne Escapen von Backslashen in String-Literalen zu vermeiden gibts Raw-Strings: Die Literale mit `r` präfixen.

Code: Alles auswählen

sql = r"""LOAD DATA INFILE "D:\test.csv" INTO TABLE test"""
Edit: Noch besser:

Code: Alles auswählen

fpath = r"D:\test.csv"
sql = """LOAD DATA INFILE "{0}" INTO TABLE test""".format(fpath)
Caldar
User
Beiträge: 46
Registriert: Sonntag 17. Mai 2009, 18:20

Danke.

Problem gelöst, lag an der fälschlicherweise erkannten Escape-Sequenz (\t)
Caldar
User
Beiträge: 46
Registriert: Sonntag 17. Mai 2009, 18:20

Edit: Noch besser:

Code: Alles auswählen

fpath = r"D:\test.csv"
sql = """LOAD DATA INFILE "{0}" INTO TABLE test""".format(fpath)
Nein, das funzt bei mir nicht wirklich: Ich bekomme einen:

AttributeError: 'str' object has no attribute 'format'
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Caldar hat geschrieben:
Edit: Noch besser:

Code: Alles auswählen

fpath = r"D:\test.csv"
sql = """LOAD DATA INFILE "{0}" INTO TABLE test""".format(fpath)
Nein, das funzt bei mir nicht wirklich: Ich bekomme einen:

AttributeError: 'str' object has no attribute 'format'
Dann benutzt Du wohl ein Python <2.6 ;-)
Caldar
User
Beiträge: 46
Registriert: Sonntag 17. Mai 2009, 18:20

Stimmt, mein Herr und Meister (respektive Auftraggeber) besteht darauf.

Noch härter finde ich aber die völlige Syntax-Reformation in der 3er-Version, wo man sogar den print-Befehl neu umgesetzt hat.
Ob das nicht viele abschreckt.
Naja, das würde jetzt zu sehr OT werden...aber ich dachte ich sprechs mal an.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Naja SO viel hat sich auch nicht getan. Neben der neuen `format`-Methode ist die p`printf`-Schreibweise auch noch möglich.
Und damit du das auch nutzen kannst nochmal <=2.5-Kompatibel:

Code: Alles auswählen

fpath = r"D:\test.csv"
sql = """LOAD DATA INFILE "%s" INTO TABLE test""" % fpath
Antworten