На этом шаге мы рассмотрим способы решения этой задачи.
Вы хотите выполнить операции ввода-вывода, используя "сырые" имена файлов, которые не декодируются и не кодируются с помощью системной кодировки имен файлов по умолчанию.
По умолчанию все имена файлов кодируются и декодируются согласно кодировке, возвращаемой sys.getfilesystemencoding(). Например:
>>> sys.getfilesystemencoding()
'utf-8'
>>>
Если вы по какой-то причине хотите обойти эту кодировку, определите имя файла, используя "сырую" строку байтов. Например:
>>> # Запись файла с использованием имени в Unicode >>> with open('jalape\xf1o.txt', 'w') as f: f.write('Spicy!') 6 >>> # Содержимое каталога (декодировано) >>> import os >>> os.listdir('.') […, 'jalapeño.txt', …] >>> # Содержимое каталога (сырое) >>> os.listdir(b'.') # Заметьте: байтовая строка […, b'jalape\xc3\xb1o.txt', …] >>> # Открыть файл с сырым именем >>> with open(b'jalape\xc3\xb1o.txt') as f: print(f.read()) Spicy! >>>
Как вы можете видеть в двух последних операциях, обращение с именами файлов немного меняется, когда байтовые строки передаются связанным с файлами функциям, таким как open() и os.listdir().
В обычных обстоятельствах вам не нужно волноваться о кодировании и декодировании имен файлов - обычные операции с именами файлов "просто работают". Однако многие операционные системы могут позволить пользователю случайно или по злому умыслу создать файлы, которые не соответствуют ожидаемым правилам кодировки. Такие имена файлов могут загадочным образом сломать программы на Python, которые работают с большим количеством файлов.
Чтение каталогов и работа с именами файлов как сырыми недекодированными байтами может решить эту проблему, хотя и за счет некоторых неудобств при программировании.
На следующем шаге мы рассмотрим вывод "плохих" имен файлов.