Python: Как мне взаимодействовать с именами файлов Unicode в Windows?(Python 2.7) - PullRequest
0 голосов
/ 13 июня 2018

Моя проблема:

  1. Начните с US Windows 10 install
  2. Создайте японское имя файла в проводнике Windows
  3. Откройте оболочку Python и os.listdir('.')
  4. В указанном имени файла полно вопросительных знаков.
  5. os.path.exists() неудивительно, что файл отчетов не найден.

NTFS сохраняет имя файла как Unicode,Я уверен, что если я воспользуюсь серией функций win32api CreateFile(), я получу имя файла Unicode , однако эти API слишком громоздки (и не переносимы).Я бы предпочел, чтобы я получал utf-8 закодированные имена файлов или байты Unicode из структуры каталогов FS, но в режиме по умолчанию этого не происходит.

Я пыталсяиграя с setlocale(), но я не наткнулся на правильные аргументы, чтобы заставить мою программу работать.Я не хочу (и не могу) устанавливать дополнительные кодовые страницы на компьютер с Windows.Это необходимо для стандартной установки Windows.

Обратите внимание, что это не имеет ничего общего с консолью.А repr () показывает, что?символы, которые заканчиваются в имени файла, указанном os.listdir('.'), являются реальными вопросительными знаками, а не каким-либо артефактом отображения.Я предполагаю, что они были добавлены API, который listdir() использует под капотом.

1 Ответ

0 голосов
/ 13 июня 2018

Возможно, вы получаете ? s при отображении этого имени файла в консоли, используя os.listdir(), но вы можете получить доступ к этому имени файла без каких-либо проблем, поскольку внутри все хранится в двоичном виде.Если вы пытаетесь скопировать имя файла и вставить его непосредственно в python, оно будет интерпретироваться как простые знаки вопроса ...

Если вы хотите открыть этот файл и выполнить какие-либо операции, посмотрите наэто ...

files = os.listdir(".")

# Possible output:
# ["a.txt", "file.py", ..., "??.html"]

filename = files[-1]    # The last file in this case
f = open(filename, 'r')

# Sample file operation

lines = f.readlines()
print(lines)
f.close()

РЕДАКТИРОВАТЬ:

В Python 2 вам нужно передать текущий путь как Unicode, что может быть сделано с помощью: os.listdir(u'.'), где. означает текущий путь.Это вернет список имен файлов в Unicode ...

...