Datei mit Umlaut im Namen öffnen

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
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Sonntag 7. Januar 2007, 12:23

Hallo zusammen,

wie der Betreff schon aussagt, habe ich ein Problem mit den Umlauten in Dateinamen. Ich habe schon Google und die Suche im Forum benutzt, aber nichts gefunden, was mir helfen könnte.

Ich habe mich auch schon mit der Konvertierung von Strings und der "Magic Line" befasst, aber das hilft wohl nur bei den Strings im Programm, nicht aber bei Dateinamen, im Gegenteil.

Folgender Code bringt eine Fehlermeldung:

Code: Alles auswählen

f = open("D:\München.txt", "r")
Es kommt die Fehlermeldung, dass "D:\M?nchen.txt" nicht gefunden wurde (No such file or directory)

Setzte ich die "Magic Line" am Anfag des Skriptes:

Code: Alles auswählen

# -*- coding: cp1252 -*-

f = open("D:\München.txt", "r")
wird der String natürlich konvertiert... Fehlermeldung: No such file or directory: 'D:\M\xfcnchen.txt'

Wie kann ich also unter Windows (mit Python 2.4) eine Datei öffnen, die Umlaute im Namen trägt?

Schon mal danke für eure Hilfe!
tobi
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Sonntag 7. Januar 2007, 13:29

Hi to.ni,

bei mir kommt da in IDLE keine Fehlermeldung.

Code: Alles auswählen

# -*- coding: cp1252 -*-


f = open("C:\Chäts.txt", "r") 
lines = f.readlines() 
f.close() 
print lines
So kommt es bei mir zu einer Ausgabe. Vielleicht bringt Dich das schon etwas weiter? :K

Aber hiermit muss es dann anscheinend doch schon gehen: (gerade im Wiki gefunden)

Code: Alles auswählen

Unicode-Strings in Dateien 
Wie oben erwähnt, sollte einer Unicode-Datei ein BOM vorangestellt werden. Das ganze kann beispielsweise so erfolgen:

>>> import codecs
>>> codecs.BOM_LE
'\xff\xfe'
>>> f.close()
>>> f = open("test.txt","wb")
>>> f.write( codecs.BOM_LE )
>>> f.write( u'K\xe4sefondue'.encode("UTF-16LE"))
>>> f.close()Damit wird eine wunderbare UTF-16LE-Codierte Textdatei mit dem Inhalt "Käsefondue" erstellt.

Das ganze kann man auch einfacher machen, wenn man einfach die "native" Endianess des Betriebssystems benutzen will:

>>> import codecs
>>> codecs.BOM_LE
'\xff\xfe'
>>> f.close()
>>> f = open("test.txt","wb",encoding="utf-16")
>>> f.write( u'K\xe4sefondue')
>>> f.close()
In diesem Fall wird das gute Python automatisch das richtige BOM erzeugen. Danke, Python!

Um die Datei einzulesen, kann man sich folgendes Codeschnippsel ansehen:

import codecs
def liesunicode(dateiname):
    datei = open(dateiname,"rb")
    bom = datei.read(2)
    if bom == codecs.BOM_LE:
        return datei.read().decode("utf-16le") 
#Wichtig, der BOM muß manuell ausgewertet werden.
#(Es gibt keine Vorschrift, die BOMs notwendig macht - 
#es ist nur eine hilfreiche Konvention). Man kann sich das aber sparen,
#wenn man zumindest bereits weiß, daß es sich um eine UTF-16 Datei #handelt - dann geht beispielsweise folgendes: 

import codecs
f = codecs.open(dateiname,encoding="utf-16")
print f.readlines()
f.close()
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Sonntag 7. Januar 2007, 13:57

Oh Gott... :shock:

das bringt mich allerdings weiter.
Habe in meinem Programmcode einen längeren Pfad mit anderem Dateinamen verwendet und natürlich war der Pfad fehlerhaft... Schande über mich! :oops:

Die erscheinende Fehlermeldung hat halt etwas seltsam ausgesehen mit dem maskierten Umlaut... Darum ging mein Verdacht in diese, falsche Richtung.

Sorry und danke für den Hinweis!

tobi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 7. Januar 2007, 14:44

to.ni hat geschrieben:wie der Betreff schon aussagt, habe ich ein Problem mit den Umlauten in Dateinamen.
Hi tobi!

Ich glaube eher, dass du ein Problem mit dem Backslash "" hast.

Ein...

Code: Alles auswählen

f = open(r"D:\München.txt", "r")
...oder ein...

Code: Alles auswählen

f = open("D:\\München.txt", "r")
...sollte dein Problem beheben.

Und so gehts auch:

Code: Alles auswählen

f = open("D:/München.txt", "r")
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten