Преобразование имен файлов Python в Unicode - PullRequest
17 голосов
/ 27 июня 2009

Я на Python 2.6 для Windows.

Я использую os.walk для чтения дерева файлов. Файлы могут содержать не 7-битные символы (например, немецкое "ae") в именах файлов. Они закодированы во внутреннем строковом представлении Pythons.

Я обрабатываю эти имена файлов с помощью функций библиотеки Python, и это не удается из-за неправильной кодировки.

Как я могу преобразовать эти имена файлов в правильные (unicode?) Строки python?

У меня есть файл "d: \ utest \ ü.txt". Передача пути как Unicode не работает:

>>> list(os.walk('d:\\utest'))
[('d:\\utest', [], ['\xfc.txt'])]
>>> list(os.walk(u'd:\\utest'))
[(u'd:\\utest', [], [u'\xfc.txt'])]

Ответы [ 6 ]

45 голосов
/ 27 июня 2009

Если вы передадите строку Unicode в os.walk(), вы получите результаты Unicode:

>>> list(os.walk(r'C:\example'))          # Passing an ASCII string
[('C:\\example', [], ['file.txt'])]
>>> 
>>> list(os.walk(ur'C:\example'))        # Passing a Unicode string
[(u'C:\\example', [], [u'file.txt'])]
6 голосов
/ 15 мая 2011

Я искал решение для Python 3.0+. Поставит это здесь, если это кому-то еще нужно.

rootdir = r'D:\COUNTRY\ROADS\'
fs_enc = sys.getfilesystemencoding()
for (root, dirname, filename) in os.walk(rootdir.encode(fs_enc)):
    # do your stuff here, but remember that now
    # root, dirname, filename are represented as bytearrays
3 голосов
/ 15 мая 2015
os.walk(unicode(root_dir, 'utf-8'))
2 голосов
/ 06 марта 2010

более прямым способом может быть попытка сделать следующее - найти кодировку вашей файловой системы, а затем преобразовать ее в Unicode. например,

unicode_name = unicode(filename, "utf-8", errors="ignore")

пойти другим путем,

unicode_name.encode("utf-8")
1 голос
/ 27 июня 2009

Нет, они не закодированы во внутреннем строковом представлении Pythons, такого нет. Они кодируются в кодировке операционной системы / файловой системы. Переход на Unicode работает для os.walk, хотя.

Я не знаю, как ведет себя os.walk, когда имена файлов не могут быть декодированы, но я предполагаю, что вы получите строку обратно, как с os.listdir (). В этом случае у вас снова будут проблемы позже. Кроме того, не вся стандартная библиотека Python 2.x будет правильно принимать параметры Юникода, поэтому вам может понадобиться закодировать их как строки в любом случае. Таким образом, проблема на самом деле может быть где-то еще, но вы заметите, если это так. ; -)

Если вам нужен больший контроль над декодированием, вы не всегда можете передать строку, а затем просто декодировать ее filename = filename.decode () как обычно.

1 голос
/ 27 июня 2009

os.walk не указано, чтобы всегда использовать os.listdir, но также не указано, как обрабатывается Unicode. Однако, os.listdir говорит:

Изменено в версии 2.3: в Windows NT / 2k / XP и Unix, если путь Объект Unicode, результатом будет список объектов Unicode. Undecodable имена файлов по-прежнему будут возвращены как строковые объекты.

Вам подходит просто использование аргумента Unicode?

for dirpath, dirnames, filenames in os.walk(u"."):
  print dirpath
  for fn in filenames:
    print "   ", fn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...