Я могу воспроизвести поведение os.listdir()
: os.listdir(unicode_name)
возвращает недоказуемые записи в виде байтов на Python 2.7:
>>> import os
>>> os.listdir(u'.')
[u'abc', '<--\x8b-->']
Обратите внимание: второе имя является байтовой, несмотря на аргумент listdir()
, являющийся Строка Unicode.
Тем не менее остается большой вопрос - как это можно решить, не прибегая к этому взлому?
blockquote>Python 3 разрешает недоказуемые байты (используя файловую систему кодирование символов) байтов в именах файлов с помощью обработчика ошибок
surrogateescape
(os.fsencode/os.fsdecode
). См. PEP-383: Non-decodable Bytes в системных символьных интерфейсах :>>> os.listdir(u'.') ['abc', '<--\udc8b-->']
Обратите внимание: обе строки являются Unicode (Python 3). И обработчик ошибок
surrogateescape
использовался для второго имени. Чтобы вернуть исходные байты:>>> os.fsencode('<--\udc8b-->') b'<--\x8b-->'
В Python 2 используйте строки Unicode для имен файлов в Windows (Unicode API), OS X (применяется utf-8) и используйте bytestrings в Linux и других системах .