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: Alles auswählen
coding = "iso-8859-1"
insert_list.append(row[fields["Strasse"]].encode(coding)+ " " + str(i))
# row[fields["Strasse"]] liefert mir als String den Straßennamen
Code: Alles auswählen
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)
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: Alles auswählen
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)
Code: Alles auswählen
csv_file = coding.UnicodeReader(open(infile), delimiter=';', encoding="iso-8859-15")
Wäre für Hinweise sehr Dankbar, denn komme im Moment nicht so richtig weiter.
Grüße.