Подтвердить что ты не робот

Как я могу открыть файлы 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

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

4b9b3361

Ответ 1

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(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 - codecs.open оставляет спецификацию UTF8 inline как символ u'\ufeff'.