UnicodeDecodeError beim Ausführen von os.walk

Ich erhalte den Fehler:

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

beim versuchen os.walk zu machen. Der Fehler tritt auf, weil einige Dateien in einem Verzeichnis das Zeichen 0x8b (nicht utf8) enthalten. Die Dateien stammen von einem Windows-System (daher die Dateinamen utf-16), aber ich habe die Dateien auf ein Linux-System kopiert und verwende Python 2.7 (läuft unter Linux), um die Verzeichnisse zu durchlaufen.

Ich habe versucht, einen Unicode-Startpfad an os.walk zu übergeben, und alle Dateien und Verzeichnisse, die es generiert, sind Unicode-Namen, bis es zu einem Nicht-UTF8-Namen kommt, und aus irgendeinem Grund werden diese Namen nicht in Unicode und konvertiert dann drosselt der code die utf-16 namen. Gibt es überhaupt eine Möglichkeit, das Problem zu lösen, wenn nicht alle anstößigen Namen manuell gefunden und geändert werden?

Wenn es in python2.7 keine Lösung gibt, kann ein Skript in python3 geschrieben werden, um den Dateibaum zu durchlaufen und die fehlerhaften Dateinamen zu korrigieren, indem sie in utf-8 konvertiert werden (indem die Nicht-utf8-Zeichen entfernt werden)? N.B. Da die Namen neben 0x8b viele Zeichen enthalten, die keine utf8-Zeichen sind, müsste das generell funktionieren.

UPDATE: Die Tatsache, dass 0x8b immer noch nur ein Btye Char ist (nur kein gültiger ASCII), macht es noch rätselhafter. Ich habe festgestellt, dass es ein Problem bei der Konvertierung eines solchen Strings in Unicode gibt, aber dass eine Unicode-Version direkt erstellt werden kann. Nämlich:

>>> 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 eine Rückverfolgung des Fehlers, den ich erhalte:

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 Ursache des Problems liegt in der Liste der Dateien, die von listdir (in Zeile 276 von os.walk) zurückgegeben wurden:

names = listdir(top)

Die Namen mit Zeichen> 128 werden als Nicht-Unicode-Zeichenfolgen zurückgegeben.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage