Hallo,
ich hab jetzt schon ne ganze Weile hier gesucht und auch jede Menge zu dem Thema gefunden udn viel rumprobiert, aber irgendwie komme ich nicht weiter.
Ich lese aus einem *.csv-File Adressen aus und will die in eine Oracle Datenbank schreiben.
Dort Sachen rein zu schreiben, hatte ich bisher noch nie Probleme mit Umlauten.
Allerdings habe ich jetzt halt diese CSV von einem Kunden und ich krieg die eingelesenen Zeilen nicht mal in der Console von MyEclipse oder in der Windowskonsole richtig ausgegeben, hab ständig Umlaut-Fehler, so wird z.B ein ä immer als \xe4 ausgegeben, in der Windowskonsole als o mit so nem komischen Zeichen drüber.
Hab dann probiert:
Code:
coding = "iso-8859-1"
insert_list.append(row[fields["Strasse"]].encode(coding)+ " " + str(i))
# row[fields["Strasse"]] liefert mir als String den Straßennamen
Aber macht keinen Unterschied, das gleich Problem. Wenn ich dass dann aber in der WIndows Konsole und nicht im MyEclipse Starte kommt folgende Fehlermeldung:
Code:
Traceback (most recent call last):
File "x:\xxx\ccc\eee\src\create_adresses.py", line 108, in
<module>
main(infile)
File "x:\xxx\ccc\eee\src\create_adresses.py", line 99, in main
readcsv(infile,db)
File "x:\xxx\ccc\eee\src\create_adresses.py", line 71, in readcsv
values = build_insert_list(row,i)
File "x:\xxx\ccc\eee\src\create_adresses.py", line 38, in build_insert_list
insert_list.append(row[fields["Kirchenbezirk"]].encode(coding))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 1: ordinal not in range(128)
Was ist das für ein Fehler? Und warum wird der in MyEclipse NICHT geworfen?
Und wie bekomme ich nun meine Adressen richtig codiert. Ich nehme an, wenn ich in der Console richtige Umlaute sehe, werden sie dann auch so in die Datenbank geschrieben.
Ein Kollege hat auch irgendwo ein kleines Modul gefunden:
Code:
import csv, codecs, cStringIO
class UTF8Recoder:
"""
Iterator that reads an encoded stream and reencodes the input to UTF-8
"""
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("utf-8")
class UnicodeReader:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
Das haben wir dann benutzt und das ganze folgender Maßen eingebunden:
Code:
csv_file = coding.UnicodeReader(open(infile), delimiter=';', encoding="iso-8859-15")
Aber da bekam ich Fehler von der Datenbank, dass das keine Strings seien.
Wäre für Hinweise sehr Dankbar, denn komme im Moment nicht so richtig weiter.
Grüße.