Problem beim Einlesen von CSV-Dateien mit Umlauten

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
Erik87
User
Beiträge: 1
Registriert: Dienstag 30. Dezember 2014, 11:06

Hallo zusammen,

ich bin neu hier im Forum und habe ein kleines Problem, bei dem ich nicht weiterkomme. Ich möchte eine CSV-Datei einlesen, die Umlaute und spanische Akzentvokale enthält. Die Wörter in der Datei sollen dann in einer Liste gespeichert werden.
Das Problem dabei ist allerdings, dass die Umlaute in der Liste nicht korrekt dargestellt werden. Ein „ö“ wird dann z. B. zu \xf6. Bei der Ausgabe außerhalb eine Liste werden die Sonderzeichen richtig dargestellt, nur eben in der Liste nicht.
Ich habe mittlerweile diverse Foreneinträge durchstöbert (darunter auch hier im Forum). Inzwischen habe ich gelernt, dass es etwas mit der Codierung (ASCII/Unicode) zu tun hat. Da ASCII keine Sonderzeichen wie Umlaute unterstützt, muss der Text in Unicode umgewandelt werden. Mit den angebotenen Lösungen bin ich bislang aber leider auf keinen grünen Zweig gekommen. Kann mir jemand weiterhelfen?? Für Hilfe wäre ich sehr dankbar.

Allerseits schon mal nen guten Rutsch!

Und so sieht mein Code aus:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
#!/usr/bin/env python

import codecs

datei = open("vokabeln.csv")
gesamtertext = datei.read()
datei.close()
dec = gesamtertext.decode('iso-8859-1')

print '"gesamtertext" ist vom Typ:',type(gesamtertext)
print 'Der dekodierte "Unicode"-Text ist vom Typ:',type(dec)

zeilenliste = dec.split(chr(10))

liste = []
for zeile in zeilenliste:
    if zeile:
        zwliste = zeile.split(";")
        liste.append([zwliste[0],zwliste[1]])

print ""
print "Ausgabe in einer Liste:"
print liste

print ""
print "Ausgabe außerhalb einer Liste:"
for vok in liste:
    print "%-18s" % vok[0], "%-19s" % vok[1]
...und so sieht die Ausgabe aus:

Code: Alles auswählen

"gesamtertext" ist vom Typ: <type 'str'>
Der dekodierte "Unicode"-Text ist vom Typ: <type 'unicode'>

Ausgabe in einer Liste:
[[u'hola', u'Hallo'], [u'el coche', u'Auto'], [u'ir en tren', u'mit dem Zug fahren'], [u'mana\xf1a', u'morgen'], [u'el pescado', u'Fisch'], [u'la estaci\xf3n', u'Bahnhof'], [u'adem\xe1s', u'au\xdferdem'], [u'el gui\xf3n', u'Bindestrich'], [u'el alem\xe1n', u'Deutsch'], [u'\xfatil', u'n\xfctzlich'], [u'con sus lenguas', u'mit ihren Sprachen'], [u'una metr\xf3polis', u'Weltstadt'], [u'yo tambi\xe9n', u'ich auch'], [u'la colonia', u'Kolonie'], [u'austrac\xedaco', u'\xf6sterreichisch'], [u'Qu\xe9 bien!', u'Wie sch\xf6n!'], [u'seg\xfan', u'gem\xe4\xdf,nach'], [u'la an\xe9cdota', u'Anekdote'], [u'el art\xedculo', u'Artikel']]

Ausgabe außerhalb einer Liste, so wie sie auch in einer Liste aussehen soll:
hola               Hallo              
el coche           Auto               
ir en tren         mit dem Zug fahren 
manaña             morgen             
el pescado         Fisch              
la estación        Bahnhof            
además             außerdem           
el guión           Bindestrich        
el alemán          Deutsch            
útil               nützlich           
con sus lenguas    mit ihren Sprachen 
una metrópolis     Weltstadt          
yo también         ich auch           
la colonia         Kolonie            
austracíaco        österreichisch     
Qué bien!          Wie schön!         
según              gemäß,nach         
la anécdota        Anekdote           
el artículo        Artikel   
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Das ist schon alles korrekt so. Um die Elemente einer Liste darzustellen, wird auf jedem Element die repr-Funktion augerufen. Und im Fall von Strings werden dann Bytes ausgegeben. Die Ausgabe ist schließlich für Programmierer gedacht, ein Benutzer sollte die nie zu sehen bekommen. Wenn du eine Ausgabe mit der korrekten Codierung möchtest, dann musst du dich selbst um die Ausgaben kümmern.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Erik87: noch zwei Hinweise: um Text-Dateien mit dem richtigen Encoding zu lesen gibt es `io.open` und für csv-Dateien das csv-Modul:

Code: Alles auswählen

import io
import csv
 
with io.open("vokabeln.csv", encoding='iso-8859-1') as datei:
    lines = csv.reader(datei, delimiter=';')
    liste = list(lines)
Antworten