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 заменяет более чем недопустимые байты из кодированной строки?
  • Как заставить интерпретатор python правильно обрабатывать символы, отличные от ASCII, в строковых операциях?
  • Юникод Python: как тестировать строку unicode
  • как читать файл, который может быть сохранен как ansi или unicode в python?
  • string.decode () против unicode (строка)
  • Изменение кодировки Windows cmd вызывает сбой Python
  • Литералы Unicode, которые работают в python 3 и 2
  • Декодирование, если это не unicode
  • Python - лучший язык программирования в мире.