Python 2.7: чтение файла с китайскими иероглифами

Я пытаюсь проанализировать данные в файлах CSV с китайскими символами в их именах (например, «1 25g»). Я использую Tkinter для выбора файлов следующим образом:

selectedFiles = askopenfilenames(filetypes=[("xlsx","*"),("xls","*")]) # Utilize Tkinker dialog window to choose files selectedFiles = master.tk.splitlist(selectedFiles) # Create list from files chosen 

Я попытался преобразовать имя файла в Юникод таким образом:

 selectedFiles = [x.decode("utf-8") for x in selectedFiles] 

Только для получения ошибки:

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 0: ordinal not in range(128) 

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

 titles = [x.encode('utf-8') for x in titles] 

Только для получения ошибки:

 IOError: [Errno 22] invalid mode ('wb') or filename: 'C:\...\\data_division_files\\\xe7\xb2\x971 25g.csv' 

Я также пробовал сочетания вышеуказанных методов безрезультатно. Что я могу сделать, чтобы эти файлы могли быть прочитаны на Python?

(Этот вопрос, хотя и был связан, не смог решить мою проблему: получить размер файла с помощью os.path.getsize () в Python 2.7.5 )

One Solution collect form web for “Python 2.7: чтение файла с китайскими иероглифами”

Когда вы вызываете decode в объекте unicode , он сначала кодирует его с помощью sys.getdefaultencoding() чтобы он мог декодировать его для вас. Вот почему вы получаете сообщение об ASCII, даже если вы не запрашивали ASCII в любом месте.

Итак, откуда вы получаете объект unicode ? Из askopenfilename . Из быстрого теста похоже, что он всегда возвращает значения unicode в Windows (предположительно, получая UTF-16 и расшифровывая его), тогда как на POSIX он возвращает некоторый unicode и некоторую str (я бы предположил, оставив в покое все, что вписывается 7-разрядный ASCII, декодирование чего-либо еще с вашей кодировкой файловой системы). Если бы вы попробовали распечатать вариант или тип или что-либо из selectedFiles , проблема была бы очевидна.


Между тем, encode('utf-8') не должен вызывать UnicodeError s … но вполне вероятно, что ваша кодировка файловой системы не является UTF-8 в Windows, поэтому она, вероятно, вызовет много UnicodeError с errno 2 (пытается открывать файлы, которые не существуют, или создавать файлы в каталогах, которые не существуют), 21 (попытка открыть файлы с недопустимыми именами файлов или каталогов в Windows) и т. д. И похоже, что это именно то, что вы видя. И нет причин для этого; просто передайте пути как-чтобы open и все будет хорошо.


Итак, в основном, если вы удалили все ваши encode и decode вызовы, ваш код, вероятно, просто сработает.

Однако есть еще более простое решение: просто используйте askopenfile или asksaveasfile вместо askopenfilename или asksaveasfilename . Пусть Tk выяснит, как использовать его пути, и просто передайте вам объекты файла, вместо того, чтобы возиться с именами путей самостоятельно.

  • Python 3 smtplib отправляет с символами unicode
  • Почему я не могу ввести японские символы в приглашении в Python3?
  • Юникод Python: как тестировать строку unicode
  • Как удалить символы, отличные от ASCII, но оставить периоды и пробелы с помощью Python?
  • Чтение данных файла Unicode с символами спецификации в Python
  • UnicodeEncodeError в urllib2
  • Как получить надежный счет символа Юникода в Python?
  • Должен ли я использовать строку Unicode по умолчанию?
  •  
    Interesting Posts for Van-Lav

    Как вы проверяете, что функция Python генерирует исключение?

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

    Как определить тип типа numpy типа float (C-API)

    Проблема с многопоточным подключением к приложениям и сокетам Python

    Конкатенация внутренних списков или ints

    вызывая выход для генератора в другой функции

    Меркаторная проекция слегка выключена

    Как запросить BigQuery программно с Python без взаимодействия с конечным пользователем?

    Как сделать группу и ось одинаковой длины?

    Прокси-сервер Python не обрабатывает запросы POST

    Каков самый простой способ удалить все пакеты, установленные в pip?

    как я могу использовать fileinput для редактирования нескольких файлов?

    Урлобин Urllib на некоторых сайтах (например, StackApps api): возвращает результаты мусора

    Matplotlib корректирует запас показателя

    Как я могу получить текст из тега <dt> с помощью <span> внутри?

    Python - лучший язык программирования в мире.