Buchstaben mit Umlauten aus einer Datei lesen

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
legargeomatrix
User
Beiträge: 9
Registriert: Dienstag 27. April 2010, 16:11

Hallo Leute,
ich habe eine .txt datei mit allen deutschen Wörtern mit 3 Buchstaben. Daraus will ich eine Liste erstellen und wörter einzeln auslesen. Mein Ansatz ist folgender:

Code: Alles auswählen

import string

#öffne die Datei mit allen Wörtern der Größe 3
text_datei = open("d://text.txt", "r")
#kopiere alles in eine Liste
text_liste = text_datei.readlines()
#schließe die Datei, da nicht mehr benötigt
text_datei.close()
#übertrage alles in kleinschrift, da unser rätsel keine Großbchst. hat
text_liste_lower = string.lower(text_liste[0])
#erstelle nun die liste mit allen wörtern
bibliothek =  string.split(text_liste_lower)
#erzeuge Liste mit allen englischen Buchstaben
#alternativ: map(chr, range(97, 123))
buchstaben = [chr(buchstabe) for buchstabe in range(97,123)]
#füge nich die buchstaben mit umlauten und das scharfe ß hinzu
buchstaben.append([chr(246), chr(228), chr(252), chr(223)]) 
Nun entsteht das Problem, dass Wörter mit Umlauten mit ihrem ASCII(?)-Code ausgegeben werden: tür -> t\xfcr
Damit kann ich nicht gut arbeiten, also was kann ich hier machen, um den String "tür" zu erhalten?
Zuletzt geändert von Anonymous am Donnerstag 13. Mai 2010, 15:28, insgesamt 1-mal geändert.
Grund: Highlighting im Code-Block aktiviert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du willst `codecs.open` nutzen.
BlackJack

@legargeomatrix: Das `string`-Modul brauchst Du hier nicht und solltest Du auch nicht verwenden. Die Funktionen die es auch als Methoden auf Zeichenketten gibt, sind veraltet und ab Python 3 auch nicht mehr in dem Modul vorhanden.

Dann solltest Du Dir mal anschauen was Du an die Namen bindest. Die stimmen nämlich nicht mit dem Inhalt überein. `text_liste_lower` ist nicht an eine Liste gebunden und ich nehme mal ganz stark an, dass es auch keinen Sinn machen wird da `split()` drauf aufzurufen. Es sei denn in der Textdatei stehen alle Wörter in der ersten Zeile, dann macht es aber auch nicht soviel Sinn erst alle Zeilen in eine Liste einzulesen.

Zuguterletzt solltest Du Dir mal die `buchstaben`-Liste anschauen. Ist das wirklich gewollt, dass sie die Buchstaben 'a' bis 'z' als einzelne Elemente enthält, die Werte für die Umlaute dann aber als Liste!?

Wobei man für diese Buchstaben dann vielleicht doch wieder das `string`-Modul gebrauchen könnte:

Code: Alles auswählen

In [659]: string.ascii_lowercase
Out[659]: 'abcdefghijklmnopqrstuvwxyz'
Wo siehst Du übrigens die Darstellung ``t\xfcr``? Wenn Du die *Liste* ausgibst? Das ist normal und das kann man nicht ändern. So ist die Zeichenkettendarstellung für Listen nun einmal implementiert, und der Gedanke dahinter ist, dass man exakt sehen kann was eine Liste enthält. Würde da nicht die `repr()`-Darstellung der Elemente verwendet, könnte man schon mit den Standardtypen in Listen sehr viel Verwirrung stiften.
legargeomatrix
User
Beiträge: 9
Registriert: Dienstag 27. April 2010, 16:11

BlackJack hat geschrieben:@legargeomatrix: Das `string`-Modul brauchst Du hier nicht und solltest Du auch nicht verwenden. Die Funktionen die es auch als Methoden auf Zeichenketten gibt, sind veraltet und ab Python 3 auch nicht mehr in dem Modul vorhanden.
aber wenn ich

Code: Alles auswählen

text_liste = text_datei.readlines()
    text_liste = text_liste[0].decode('unicode')
    text_liste[0].lower
    bibliothek =  text.liste[0].split
nehme, hat das keinen Effekt... wie kann man das am sinnvollsten anwenden?
BlackJack hat geschrieben: Dann solltest Du Dir mal anschauen was Du an die Namen bindest. Die stimmen nämlich nicht mit dem Inhalt überein. `text_liste_lower` ist nicht an eine Liste gebunden und ich nehme mal ganz stark an, dass es auch keinen Sinn machen wird da `split()` drauf aufzurufen. Es sei denn in der Textdatei stehen alle Wörter in der ersten Zeile, dann macht es aber auch nicht soviel Sinn erst alle Zeilen in eine Liste einzulesen.
Also die Datei ist tatsächlich nur eine Zeile. Es funktioniert darum auch so wie gedacht in der Fassung.
BlackJack hat geschrieben: Zuguterletzt solltest Du Dir mal die `buchstaben`-Liste anschauen. Ist das wirklich gewollt, dass sie die Buchstaben 'a' bis 'z' als einzelne Elemente enthält, die Werte für die Umlaute dann aber als Liste!?

Wobei man für diese Buchstaben dann vielleicht doch wieder das `string`-Modul gebrauchen könnte:

Code: Alles auswählen

In [659]: string.ascii_lowercase
Out[659]: 'abcdefghijklmnopqrstuvwxyz'

Ja, da hast du recht... muss ich wohl mit 5 appends separat machen.
BlackJack hat geschrieben: Wo siehst Du übrigens die Darstellung ``t\xfcr``? Wenn Du die *Liste* ausgibst? Das ist normal und das kann man nicht ändern. So ist die Zeichenkettendarstellung für Listen nun einmal implementiert, und der Gedanke dahinter ist, dass man exakt sehen kann was eine Liste enthält. Würde da nicht die `repr()`-Darstellung der Elemente verwendet, könnte man schon mit den Standardtypen in Listen sehr viel Verwirrung stiften.
[/quote]
Ja, da hast du ebenfalls recht. Die wörter werden richtig dargestellt (len()=3) und ich kann damit arbeiten... die Frage hat sich somit erledigt.
BlackJack

@legargeomatrix: Natürlich hat es keinen Effekt wenn Du nur die Methode referenzierst aber nicht *aufrufst* und natürlich würde sich selbst dann nicht viel ändern wenn Du das Ergebnis einfach ignorierst. Zeichenketten kann man nicht verändern, also haben die Methoden einen Rückgabewert.

'unicode' ist übrigens keine Kodierung.

Statt die Datei zeilenweise zu lesen und dann nur die Erste zu verwenden, könntest Du die Datei auch *ganz* einlesen und splitten. Das würde nur dann nicht gehen wenn da noch mehr in der Datei steht. Falls da drin mehr steht, das aber nicht gebraucht wird, sollte man IMHO auch nicht alle Zeilen lesen, sondern nur die erste.

Statt fünf separater `append()`\s könntest Du auch mal schauen was Listen noch so an Methoden bieten.
Antworten