Seite 1 von 1

Problem mit "LOAD DATA INFILE"-Befehl

Verfasst: Samstag 30. Mai 2009, 13:40
von Caldar
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?

Verfasst: Samstag 30. Mai 2009, 19:30
von Leonidas
Eventuell bekommst du statt \t im Dateinamen ein Tab, weil das eine Escape-Sequenz ist...

Verfasst: Samstag 30. Mai 2009, 21:39
von cofi
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)

Verfasst: Sonntag 31. Mai 2009, 11:31
von Caldar
Danke.

Problem gelöst, lag an der fälschlicherweise erkannten Escape-Sequenz (\t)

Verfasst: Montag 1. Juni 2009, 14:49
von Caldar
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'

Verfasst: Montag 1. Juni 2009, 14:55
von Hyperion
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 ;-)

Verfasst: Montag 1. Juni 2009, 15:07
von Caldar
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.

Verfasst: Montag 1. Juni 2009, 16:09
von cofi
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