Python-APi-doc zu csv

23/07/2010 - 09:22 von Mathias Jeschke | Report spam
Hallo Python-Programmierer,

um meine CSV-Dateien im UTF-8-Format zu verarbeiten, fand ich in der
Python-API-Dokumentation folgendes Beispiel:

import csv

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
dialect=dialect, **kwargs)
for row in csv_reader:
# decode UTF-8 back to Unicode, cell by cell:
yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
"csv.reader" hat diese Signatur:
csv.reader(csvfile[, dialect='excel'][, fmtparam])


Leider verstehe ich nicht, warum unicode_csv_reader() versucht die
Eingabedaten (aus "csvfile") durch einen "utf_8_encoder()" zu schicken.

1. Ist es aus meiner Sicht Quatsch, weil die Daten in der Datei schon
in UTF-8 sind.
2. Erhàlt man einen "UnicodeDecodeError", weil die Binàrdaten bei
"yield line.encode('utf-8')" keinen gültigen Unicode darstellen.
3. Der Code funktioniert übrigens, wenn man den csv.reader ohne
"utf_8_encoder(unicode_csv_data)" füttert:
csv_reader = csv.reader(unicode_csv_data,
dialect=dialect, **kwargs)

Nun die Frage - bin ich zu blöd den Beispiel-Code zu verstehen -
ich habe nach dem Lesen des Python-Unicode-HOWTOS das so verstanden,
dass Unicode-Strings in Dateien immmer encodiert werden müssen
(also mit 'ascii', 'utf8', ...).

Also können aus einer Datei ja kaum Unicode-Strings "herausfallen", oder?

Gruß,
Mathias
 

Lesen sie die antworten

#1 Peter Otten
23/07/2010 - 10:09 | Warnen spam
Mathias Jeschke wrote:

Hallo Python-Programmierer,

um meine CSV-Dateien im UTF-8-Format zu verarbeiten, fand ich in der
Python-API-Dokumentation folgendes Beispiel:

import csv

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
dialect=dialect, **kwargs)
for row in csv_reader:
# decode UTF-8 back to Unicode, cell by cell:
yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
"csv.reader" hat diese Signatur:
csv.reader(csvfile[, dialect='excel'][, fmtparam])


Leider verstehe ich nicht, warum unicode_csv_reader() versucht die
Eingabedaten (aus "csvfile") durch einen "utf_8_encoder()" zu schicken.



Weil er annimmt, dass die Daten als unicode-Strings vorliegen:

"""
unicode_csv_reader() below is a generator that wraps csv.reader to handle
Unicode CSV data (a list of Unicode strings).
"""


1. Ist es aus meiner Sicht Quatsch, weil die Daten in der Datei schon
in UTF-8 sind.



Wenn die Daten in UTF-8 sind, in der Tat. Ein realistisches
Anwendungsbeispiel wàren Daten in einem beliebigen encoding:

data = codecs.open(filename, encoding="utf-16")
for row in unicode_csv_reader(data):
print row

Das funktioniert auch mit "utf-8", hat aber natürlich einen überflüssigen
decode/encode-Zyklus zur Folge.

2. Erhàlt man einen "UnicodeDecodeError", weil die Binàrdaten bei
"yield line.encode('utf-8')" keinen gültigen Unicode darstellen.



Jepp, weil die Eingabedaten nicht wie erwartet in Unicode vorliegen gibt's
einen *Decode* und keinen *Encode* Fehler.

3. Der Code funktioniert übrigens, wenn man den csv.reader ohne
"utf_8_encoder(unicode_csv_data)" füttert:
csv_reader = csv.reader(unicode_csv_data,
dialect=dialect, **kwargs)



Wenn die Daten im verlangten Format vorliegen, kannst du dir die Umwandlung
sparen.

Nun die Frage - bin ich zu blöd den Beispiel-Code zu verstehen -
ich habe nach dem Lesen des Python-Unicode-HOWTOS das so verstanden,
dass Unicode-Strings in Dateien immmer encodiert werden müssen
(also mit 'ascii', 'utf8', ...).

Also können aus einer Datei ja kaum Unicode-Strings "herausfallen", oder?



Dazu sag ich lieber nix ;)

Peter

Ähnliche fragen