UnicodeDecodeError bei der Durchführung os.gehen

Bin ich immer die Fehlermeldung:

'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)

wenn Sie versuchen zu tun os.Fuss. Der Fehler tritt auf, weil einige der Dateien in einem Verzeichnis haben, das 0x8b (nicht-utf8-Zeichen in Ihnen. Die Dateien stammen von einem Windows-system (also die utf-16-Dateinamen), aber ich habe kopiert die Dateien auf einem Linux-system und bin mit python 2.7 (läuft auf Linux) zum Durchlaufen der Verzeichnisse.

Ich habe versucht, übergeben Sie eine unicode-start Pfad zum os.Weg, und alle die Dateien & dirs es generiert, werden unicode-Namen, bis es kommt zu einer nicht-utf8-Namen, und dann aus irgendeinem Grund, es nicht konvertieren Sie diese Namen in unicode und dann den code drosseln auf die utf-16-Namen. Gibt es trotzdem, um das problem zu lösen kurz manuell suchen und ändern Sie alle das beleidigende Namen?

Wenn es keine Lösung ist in python2.7, kann ein Skript geschrieben in Python ist3 zum Durchlaufen des Dateibaumes und beheben die schlechte Dateinamen durch die Konvertierung in utf-8 (durch entfernen der nicht-utf8-Zeichen)? N. B. es gibt viele nicht-utf8-Zeichen in den Namen neben 0x8b, so würde es brauchen, um die Arbeit in einer Allgemeinen Weise.

UPDATE: Die Tatsache, dass 0x8b ist nur noch ein btye char (nicht nur gültige ascii -) macht es noch rätselhafter. Ich habe überprüft, dass es ein problem der Konvertierung so ein string nach unicode, aber, dass eine unicode-version erstellt werden kann direkt. Zu Witz:

>>> test = 'a string \x8b with non-ascii'
>>> test
'a string \x8b with non-ascii'
>>> unicode(test)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 9: ordinal not in  range(128)
>>> 
>>> test2 = u'a string \x8b with non-ascii'
>>> test2
u'a string \x8b with non-ascii'

Hier ist ein traceback des Fehlers bin ich immer:

80.         for root, dirs, files in os.walk(unicode(startpath)):
File "/usr/lib/python2.7/os.py" in walk
294.             for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
294.             for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
284.         if isdir(join(top, name)):
File "/usr/lib/python2.7/posixpath.py" in join
71.             path += '/' + b

Exception Type: UnicodeDecodeError at /admin/casebuilder/company/883/
Exception Value: 'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)

Die Wurzel des Problems tritt in der Liste der Dateien zurückgegeben, die von listdir (auf Zeile 276 von os.Fuß):

names = listdir(top)

Den Namen mit chars > 128 zurückgegeben, die als non-unicode-Zeichenfolgen.

  • Ich denke, man könnte fangen Sie die Ausnahmen und diese separat behandeln?
  • Können Sie den vollständigen traceback?
  • Was meinst du mit "nicht-UTF8"? Byte 0x8b sicherlich ist nicht gültig als ASCII, aber wir würden sehen müssen, die folgenden bytes zu wissen, ob es gültig war, als UTF-8. Nur weil Sie gesehen haben, ein byte von 0x8b, bedeutet nicht, es versucht darzustellen U+008B als Charakter.
  • versuchen: os.walk(unicode(path)).
InformationsquelleAutor Scott | 2014-02-14
Schreibe einen Kommentar