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

  • Регулярные выражения и коды символов в данных экспорта Scrapy
  • Какой самый быстрый способ снять и заменить документ с высокими символами Юникода с помощью Python?
  • Запись строк unicode через sys.stdout в Python
  • Как сделать форматирование строк с помощью unicode emdash?
  • Поддерживает ли Python 2.5.2 Unicode для lower () и upper ()?
  • Почему имена POST с Unicode отправляются правильно при использовании multipart / form-data?
  • Как я могу использовать io.StringIO () с модулем csv?
  • Python не открывает японские имена файлов
  •  
    Interesting Posts for Van-Lav

    Python 2.7 с ошибкой API blomberg API blpapi

    Управление подключением к redis из Python

    Не удалось запустить pip: UnicodeDecodeError

    как отсортировать элемент кортежа сначала на основе ключа, а затем на основе значения

    Выполнить скрипт оболочки из python с переменной

    Scrapy: Каков правильный способ использования start_requests ()?

    Как отлаживать C-расширения для Python в Windows

    Какая кодировка нужна для отображения знака GBP (знак фунта) с использованием python на cygwin в Windows XP?

    на pypi.python.org, что приведет к тому, что скрытые старые версии будут возвращены явным поиском

    Взвешенное стандартное отклонение в NumPy?

    matplotlib – Как построить произвольно ориентированный прямоугольник (или любую форму)?

    ubuntu ImportError: невозможно импортировать имя MAXREPEAT

    Ошибка сегментации с opencv, в python на малине

    Каков самый pythonic способ ведения журнала для нескольких модулей и нескольких обработчиков с указанной кодировкой?

    Обнаружение, если электронное письмо является «уведомлением о статусе доставки» и извлекает информацию – Python

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