listdir неправильно печатает неанглийские буквы - PullRequest
4 голосов
/ 31 марта 2012

на Python 2.7,

for dir in os.listdir("E:/Library/Documents/Old - Archives/Case"):
   print dir

распечатывает:

Danny.xlsx
Dannyh.xlsx
~$??? ?? ?????? ??? ???? ???????.docx

пока это:

# using a unicode literal
for dir in os.listdir(u"E:/Library/Documents/Old - Archives/Case"):
   print dir

распечатывает:

Dan.xlsx
Dann.xlsx

Traceback (most recent call last):
  File "E:\...\FirstModule.py", line 31, in <module>
    print dir
  File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-4: character maps to <undefined>

Название файла на иврите, как таковое: המסמך.xls

Как я могу сделать так, чтобы он отображался на иврите в Python?

Ответы [ 3 ]

6 голосов
/ 31 марта 2012

Версия с u'' строковым литералом работает нормально: запросите путь в Unicode, и вы получите в ответ путь Unicode, позволяющий работать с именами файлов, которые содержат символы вне текущей кодовой страницы.* Ваша проблема возникает только из-за print имени файла.Получение вывода Unicode в командную строку Windows является пробным.

Функция печати стандартной библиотеки C по умолчанию ограничена кодовой страницей локали.Если вы не вызовете функцию Win32 API WriteConsoleW напрямую (с помощью ctypes), вы никогда не получите надежную консольную поддержку Unicode;и даже тогда он не будет работать, если не будет выбран подходящий нестандартный шрифт.Это затрагивает практически все не родные инструменты командной строки, а не только Python.

1 голос
/ 07 мая 2012

Решено: # -*- coding: utf-8 -*- вверху документа решено.

1 голос
/ 31 марта 2012

Проблема в том, что ваша консоль вывода использует кодировку cp1252 для вашего сообщения об ошибке, и иврит не может быть напечатан под этой кодировкой.Используйте IDE, которая поддерживает UTF-8, и шрифт в этой IDE, который поддерживает иврит, и он будет работать правильно при использовании os.listdir с путем Unicode.

Вот пример из PythonWin IDE с и без Unicode-пути.

PythonWin 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32.
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> import os
>>> for f in os.listdir('.'):
...     print f
...     
x.exe
x.py
x.pyc
y.py
?????.xls
>>> for f in os.listdir(u'.'):
...     print f
...     
x.exe
x.py
x.pyc
y.py
המסמך.xls

Также обратите внимание, что объявление кодировки в вашем исходном файле не делает ничего для генерации вывода. только объявляет, в какой кодировке сохранен исходный файл, что влияет на возможность записи не-ASCII символов в исходном файле .

...