[Python-de] glob stirbt mit unicode error

Christopher Arndt chris at chrisarndt.de
Di Mär 6 19:16:20 CET 2012


On 06.03.2012 17:42, robert at redcor.ch wrote:
> was kann ich da machen um das Problem zu beheben?
> danke für eure Typs.
>
Lass mich raten,  die Variable 'ospath' referenziert ein
Unicode-Stringobjekt, oder?

Die Funktionen in os.path haben die etwas ungewöhnliche EIgenschaft,
wenn man ihnen einen Pfad als Unicode-String übergibt, auch
Unicodestrings als Ergebnis zurückzuliefern. In der Erweiterung trifft
dies auch auf glob.glob() zu.

>>> import glob
>>> glob.glob('*')
['file1', 'file2', ..., 'filen']
>>> glob.glob(u'*')
[u'file1', u'file2', ..., u'filen']

Das klappt aber nur, wenn die Dateinamen mit dem Default
Filesystem-Encoding zu Unicode dekodiert werden können.

>>> sys.getfilesystemencoding()
'UTF-8'

Unter mir noch nicht ganz ersichtlichen Umständen kann es dabei zu den
von dir erlebten UnicodeDecoding Errors kommen, wenn Filenamen vorhanden
sind, die nicht dem Filesysetmencoding entsprechen, manchmal aber auch
nicht (dann wird einfach ein normaler, nicht-dekodierter String für die
entspr. Datei zurückgegeben).

Lösungsmöglichkeit:

a) Pfadangaben immer als opaque Byte-Strings betrachten und bei der
Ausgabe(print, etc.) ggf. repr() benutzen.

b) die intern verwendeten Uncode-String immer selbst von nach/zu
Filesystemencoding codieren, dem User die Möglichkeit geben, das
benutzte Encoding zu setzen und evtl. auch ein Fallback.

for file in os.listdir(path):
    try:
        file = file.decode(options.fsencoding)
    except UnicodeDecodeError:
        file = file.decode(option.fallback_fsencoding)

Wenn man alle Fehler abfangen will, kann man im zweiten decode-Aufruf
auch noch errors="backslashreplace" o.ä. setzen, aber das würde ich
nicht unbedingt empfehlen.

Chris


Mehr Informationen über die Mailingliste python-de