glob stirbt mit unicode error
Hoi zäme, auf einer linux-box versuche ich ein directory listing abzuarbeiten. Dazu nutze ich in etwa folgendes: files += glob.glob(ospath + '/*pdf') das verursacht folgenden Fehler: File "/usr/local/lib/python2.6/glob.py", line 16, in glob return list(iglob(pathname)) File "/usr/local/lib/python2.6/glob.py", line 43, in iglob yield os.path.join(dirname, name) File "/usr/local/lib/python2.6/posixpath.py", line 70, in join path += '/' + b File "/usr/local/lib/python2.6/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 14: invalid continuation byte das Problem ist wohl, dass einige der Dateien von Windows mit umlaufen geschrieben wurden. Das python-Systemencoding is 'utf-8' was kann ich da machen um das Problem zu beheben? danke für eure Typs. Robert
On 06.03.2012 17:42, robert@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
Am 06.03.2012 19:16, schrieb Christopher Arndt:
On 06.03.2012 17:42, robert@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 _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de Besten Dank Chris, wenn ich nur string verwende, klappts.
wobei ich jetzt eine Meldung bekomme: <string>:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal Wobei, die Warnung kann auch von woanders her kommen Gruss Robert
Robert Rottermann wrote:
wenn ich nur string verwende, klappts.
wobei ich jetzt eine Meldung bekomme: <string>:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
Wobei, die Warnung kann auch von woanders her kommen
Du solltest die Warnung nicht ignorieren; sie bedeutet, dass du unicode und (nicht-ascii-) str vergleichst, und das Ergebnis ist mit hoher Wahrscheinlichkeit nicht das, was du erwartest: u"abc" == "abc" # True u"Überraschung" == "Überraschung" # False, beim ersten solchen Vergleich # gibt's die Warnung
robert@redcor.ch wrote:
Hoi zäme,
auf einer linux-box versuche ich ein directory listing abzuarbeiten. Dazu nutze ich in etwa folgendes:
files += glob.glob(ospath + '/*pdf') das verursacht folgenden Fehler:
File "/usr/local/lib/python2.6/glob.py", line 16, in glob return list(iglob(pathname)) File "/usr/local/lib/python2.6/glob.py", line 43, in iglob yield os.path.join(dirname, name) File "/usr/local/lib/python2.6/posixpath.py", line 70, in join path += '/' + b File "/usr/local/lib/python2.6/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 14: invalid continuation byte
das Problem ist wohl, dass einige der Dateien von Windows mit umlaufen geschrieben wurden. Das python-Systemencoding is 'utf-8'
was kann ich da machen um das Problem zu beheben? danke für eure Typs.
Ist ospath ein Unicodestring? Wenn ja, hast du mal versucht, durchgehend bytestrings zu verwenden? Also if isinstance(ospath, unicode): ospath = ospath.encode("utf-8") files += glob.glob(ospath + '/*pdf')
Am 06.03.2012 19:16, schrieb Peter Otten:
robert@redcor.ch wrote:
Hoi zäme,
auf einer linux-box versuche ich ein directory listing abzuarbeiten. Dazu nutze ich in etwa folgendes:
files += glob.glob(ospath + '/*pdf') das verursacht folgenden Fehler:
File "/usr/local/lib/python2.6/glob.py", line 16, in glob return list(iglob(pathname)) File "/usr/local/lib/python2.6/glob.py", line 43, in iglob yield os.path.join(dirname, name) File "/usr/local/lib/python2.6/posixpath.py", line 70, in join path += '/' + b File "/usr/local/lib/python2.6/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 14: invalid continuation byte
das Problem ist wohl, dass einige der Dateien von Windows mit umlaufen geschrieben wurden. Das python-Systemencoding is 'utf-8'
was kann ich da machen um das Problem zu beheben? danke für eure Typs. Ist ospath ein Unicodestring? Wenn ja, hast du mal versucht, durchgehend bytestrings zu verwenden? Also
if isinstance(ospath, unicode): ospath = ospath.encode("utf-8") files += glob.glob(ospath + '/*pdf')
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de das hat geholfen danke robert
participants (4)
-
Christopher Arndt
-
Peter Otten
-
Robert Rottermann
-
robert@redcor.ch