Problem mit glob und Sonderzeichen in Dateinamen (py 3.3.0)

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
klaus.kleber
User
Beiträge: 3
Registriert: Sonntag 18. November 2012, 18:19

Hallo,

ich schreibe mit Python Skripte um meine Musiksammlung zu bearbeiten. (Ich möchte z.B. alle flac-Dateien in einem Ordner als Parameter an ein Kommandozeilentool übergeben um Replay Gain Tags zu erstellen.)

Dabei ist ein Problem bei Dateinamen aufgetreten, die bestimmte Sonderzeichen enthalten. Das Problem lässt sich sehr einfach mit dem folgenden Code nachvollziehen:

import glob
files = glob.glob('*.flac')
print(files)

Wenn sich jetzt z.B. eine Datei mit dem Namen "ş.flac" im Verzeichnis befindet, dann erhalte ich den folgenden Fehler wenn ich das Skript ausführe:

Traceback (most recent call last):
File "test.py", line 4, in <module>
print(datfiles)
File "C:\Python33\lib\encodings\cp850.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u015f' in position 2: character maps to <undefined>

Leider kann ich aufgrund des Fehlers mein Skript nicht bei allen Musikalben anwenden :( Ich hab mich mittlerweile das halbe Wochenende mit Zeichencodierungen beschäftigt und kann die ganze UTF-8 Story, aber leider hat das alles nichts geholfen. Kann mir bitte jemand von euch einen Tipp geben?

Ich verwende übrigens Python 3.3.0 64bit unter Windows 7.

Vielen Dank!
BlackJack

@klaus.kleber: Wenn man sich den Traceback anschaut erwartet das Ziel der Ausgabe cp850 kodierten Text. Das Zeichen ş ist dort nicht enthalten und kann dementsprechend auch nicht ausgegeben werden. Was würdest Du denn erwarten was in dem Fall passieren soll?
klaus.kleber
User
Beiträge: 3
Registriert: Sonntag 18. November 2012, 18:19

Dass die Sonderzeichen nicht auf dem Bildschirm dargestellt werden können stört mich nicht weiter, aber ich möchte gerne diese Sonderzeichen-Dateinamen als Parameter an ein Kommandozeilentool übergeben (metaflac). Das funktioniert leider auch nicht. Aber ich habe gerade festgestellt, dass das nicht mal in der Windows 7 Eingabeaufforderung funktioniert. Da werden die Dateinamen nicht richtig dargestellt. Im Windows Explorer werden sie allerdings richtig dargestellt. Es scheint mir also ein Windows-Problem zu sein.

Vielleicht hat trotzdem jemand einen Tip (außer Linux zu booten...)
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ich habe kein Windows um es auszuprobieren, aber wenn ich mich richtig erinnere kodiert Windows Dateinamen mit der CP 1252. Wie das glob-Modul aber damit umgeht: keine Ahnung.

Im Zweifelsfall: os.listdir(), oder - wenn es in die Tiefe gehen soll - os.walk().
klaus.kleber
User
Beiträge: 3
Registriert: Sonntag 18. November 2012, 18:19

Python scheint doch nicht das Problem zu sein.

Der print-Befehl erzeugt anscheinend eine Fehlermeldung weil ich unter Windows 7 erst eine für die Sonderzeichen passende Codepage einstellen müsste (leben wir noch in den 90er Jahren?).

Das andere Problem ist, dass die Kommandozeilenprogramme, die ich benutzen möchte (flac, metaflac), unter Windows 7 anscheinend keine Unicode-Dateinamen unterstützen...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es ist ein Unterscheid, ob die Programme oder cmd.exe Unicode nicht unterstützt.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

klaus.kleber hat geschrieben:Der print-Befehl erzeugt anscheinend eine Fehlermeldung weil ich unter Windows 7 erst eine für die Sonderzeichen passende Codepage einstellen müsste (leben wir noch in den 90er Jahren?).
Die Windows 7 Kommandozeile ist standardmäßig in den 90er Jahren.

Unter Linux sind die Terminals lange standardmäßig mit UTF-8 und das ist auch das Encoding was Python 3 dann dementsprechend auch nutzt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten