kodierung beim einlesen externer txt datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PauleJS
User
Beiträge: 34
Registriert: Freitag 22. Oktober 2010, 14:58

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";....
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
PauleJS
User
Beiträge: 34
Registriert: Freitag 22. Oktober 2010, 14:58

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?
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:

Code: Alles auswählen

In [6]: csv.excel.delimiter
Out[6]: ','
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.
PauleJS
User
Beiträge: 34
Registriert: Freitag 22. Oktober 2010, 14:58

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...
Antworten