Seite 1 von 1
kodierung beim einlesen externer txt datei
Verfasst: Montag 20. Dezember 2010, 16:29
von PauleJS
hallo,
ich möchte eine txt datei einlesen und habe via notepad++ die kodierung der datei auf ISO 8859-1 (latin-1) verändert.
Code: Alles auswählen
import csv
import codecs
ifile = 'test1.txt'
reader = csv.reader(codecs.open(ifile, 'rb', encoding='latin-1'))
for row in reader:
print row
Traceback (most recent call last):
File "C:\test1.py", line 15, in <module>
for row in reader:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
kurzer blick in die textdatei
Code: Alles auswählen
"Beschreibung";"Marke";....
"Geräumige Geldbörse"; "Sneaker";....
Re: kodierung beim einlesen externer txt datei
Verfasst: Montag 20. Dezember 2010, 19:01
von Hyperion
Das csv-Modul kann nicht mit Unicode umgehen (zumindest in Python 2.x); schau Dir dazu mal die Doku an. Dort gibt es für einen Unicode-Reader weiter unten ein Beispiel.
Re: kodierung beim einlesen externer txt datei
Verfasst: Dienstag 21. Dezember 2010, 10:01
von PauleJS
ich habe es nun mal mit dem UnicodeReader probiert und bekomme dabei aber nen key error!
in der ersten zeile sind die header die ich hier erstmal in eine liste übergebe, anhand der header möchte ich dann die informationen weiterverarbeiten.
Code: Alles auswählen
from csv_coding import UnicodeReader
ifile = open('file.txt')
reader = UnicodeReader(ifile)
rownum = 0
header = {}
for row in reader:
if rownum == 0:
for col in range(0, len(row)):
header[row[col]] = col
print header # ausgabe der header (werden richtig und vollstaendig angezeigt)
else:
print row[header["Title"]] # key error
rownum += 1
die UnicodeReader klasse
Code: Alles auswählen
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
warum bekomme ich hier einen key error?
Re: kodierung beim einlesen externer txt datei
Verfasst: Dienstag 21. Dezember 2010, 11:16
von BlackJack
@PauleJS: Du bekommst da einen `KeyError` weil "Title" nicht als Schlüssel in dem Dictionary vorhanden ist. Schau Dir die Ausgabe von dem Dictionary noch mal *genau* an. Wenn Deine Datei so ähnlich aussieht, wie dass was Du weiter oben gezeigt hast, dann werden die Zeilen als *eine* Spalte gelesen, denn die Datei liegt nicht im "Excel-Dialect" vor. Denn:
Wenn es daran liegt, hättest Du auch stutzig werden müssen, dass ``print header`` trotz mehrerer Spalten nur einmal ausgeführt wird.
Davon abgesehen sieht das ein wenig "unpythonisch" aus. Eine Zahl parallel zu einer Schleife hochzählen macht man mit `enumerate()` und nicht "per Hand". Das gilt sowohl für die äussere Schleife und `rownum` als auch für die innere Schleife und `col`. `rownum` sollte man sich allerdings sparen. Wenn man die erste Zeile anders behandeln möchte als den Rest, dann sollte man das einfach vor der Schleife machen, in der man den Rest verarbeitet und nicht in der Schleife immer und immer wieder prüfen ob's denn die erste Zeile ist.
Re: kodierung beim einlesen externer txt datei
Verfasst: Dienstag 21. Dezember 2010, 14:36
von PauleJS
ok, das mit dem header war unsinnig! ich habe es nun mit dem dictreader probiert, aber bekomme immer noch einen key error
Code: Alles auswählen
from csv_unicode import make_dictreader
ifile = open('file.txt')
reader = make_dictreader(ifile)
for row in reader:
print row['Title'] # error key
make_dictreader
Code: Alles auswählen
def make_dictreader(fin, encoding="UTF-8"):
reader = csv.DictReader(fin)
reader.reader = UnicodeReader(fin).reader
return reader
viellt muss ich hier auch noch den delimiter angeben, aber ich weiß noch nicht wo...