Как я могу открыть файлы UTF-16 на Python 2.x?

Я работаю над инструментом Python, который должен иметь возможность открывать файлы кодировок UTF-8 и UTF-16. В Python 3.2 я использую следующий код, чтобы попытаться открыть файл с помощью UTF-8, а затем попробовать его с UTF-16, если есть ошибка Unicode:

def readGridFromPath(self, filepath): try: self.readGridFromFile(open(filepath,'r',encoding='utf-8')) except UnicodeDecodeError: self.readGridFromFile(open(filepath,'r',encoding='utf-16')) 

( readGridFromFile либо завершит выполнение, либо поднимет UnicodeDecodeError .)

Однако, когда я запускаю этот код в Python 2.x, я получаю:

 TypeError: 'encoding' is an invalid keyword argument for this function 

В документах я вижу, что open() Python 2.x не имеет ключевого слова для encoding . Есть ли способ обойти это, что позволит мне сделать мой код Python 2.x совместимым?

One Solution collect form web for “Как я могу открыть файлы UTF-16 на Python 2.x?”

io.open является заменой для ваших нужд, поэтому приведенный вами пример кода будет выглядеть следующим образом в Python 2.x:

 import io def readGridFromPath(self, filepath): try: self.readGridFromFile(io.open(filepath, 'r', encoding='utf-8')) except UnicodeDecodeError: self.readGridFromFile(io.open(filepath, 'r', encoding='utf-16')) 

io.open подробно описывается io.open . Его прототип:

io.open ( file, mode = 'r', buffering = -1, encoding = None , errors = None, newline = None, closefd = True )

Сам модуль io был разработан как уровень совместимости между Python 2.x и Python 3.x, чтобы облегчить переход на Py3k и упростить обратный перенос и обслуживание существующего кода Python 2.x.

Также обратите внимание, что может быть оговорка, использующая codecs.open , поскольку она работает только в двоичном режиме :

Примечание. Файлы всегда открываются в двоичном режиме, даже если не указан бинарный режим. Это делается для предотвращения потери данных из-за кодирования с использованием 8-битных значений. Это означает, что автоматическое преобразование '\ n'` не выполняется при чтении и записи.

Также вы можете столкнуться с проблемами ручного обнаружения и удаления UTF8 BOM – codecs.open оставляет UTF8 BOM inline как u'\ufeff' .

  • Hack Jinja2 для кодирования с `utf-8` вместо` ascii`?
  • Python, UnicodeDecodeError
  • Как исправить ошибку кодирования Unicode с помощью модуля hashlib?
  • Как исправить одну строку юникода, например «\ u8bf8 \ u845b \ u4eae» в python?
  • Запись строки UTF-8 в MySQL с помощью Python
  • Поддерживает ли Python 2.5.2 Unicode для lower () и upper ()?
  • Python, file (1) - Почему числа и диапазон (0x20, 0x100) используются для определения текстового или двоичного файла
  • Интерфейс Python для PayPal - urllib.urlencode не-ASCII-символы с ошибкой
  • Python - лучший язык программирования в мире.