Backporting Python 3 open (encoding = "utf-8") на Python 2

У меня есть кодовая база Python, построенная для Python 3, которая использует Python 3 style open () с параметром кодирования:

https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47

with open(fname, "rt", encoding="utf-8") as f: 

Теперь я хотел бы передать этот код в Python 2.x, чтобы у меня была кодовая база, которая работает с Python 2 и Python 3.

Какова рекомендуемая стратегия для работы с open() различиями и отсутствием параметра кодирования?

Могу ли я иметь обработчик файла стиля Python 3 open() который передает потоки, поэтому он будет действовать как Python 2 open() ?

4 Solutions collect form web for “Backporting Python 3 open (encoding = "utf-8") на Python 2”

1. Чтобы получить параметр кодирования в Python 2:

Если вам нужно только поддерживать Python 2.6 и 2.7, вы можете использовать io.open вместо open . io – новая подсистема io для Python 3, и она существует и в Python 2,6 ans 2.7. Имейте в виду, что в Python 2.6 (а также в версии 3.0) он реализован исключительно на python и очень медленный, поэтому, если вам нужна скорость чтения файлов, это не очень хороший вариант.

Если вам нужна скорость, или вам нужно поддерживать Python 2.5 или ранее, вместо этого вы можете использовать codecs.open . Он также имеет параметр кодирования и очень похож на io.open за исключением того, что он обрабатывает линейные окончания по-разному.

2. Чтобы получить обработчик файла стиля open() Python 3, который передает потоки:

 open(filename, 'rb') 

Обратите внимание на «b», что означает «байты».

я думаю

 from io import open 

следует сделать.

Вот один из способов:

 with open("filename.txt", "rb") as f: contents = f.read().decode("UTF-8") 

Это может сделать трюк:

 import sys if sys.version_info[0] > 2: # py3k pass else: # py2 import codecs import warnings def open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None): if newline is not None: warnings.warn('newline is not supported in py2') if not closefd: warnings.warn('closefd is not supported in py2') if opener is not None: warnings.warn('opener is not supported in py2') return codecs.open(filename=file, mode=mode, encoding=encoding, errors=errors, buffering=buffering) 

Затем вы можете сохранить код в пути python3.

Обратите внимание, что некоторые API, такие как newline , closefd , closefd , не работают

Interesting Posts

Десятичный десятичный код Python. Ценная точность не соответствует вольфрам-альфа

Можем ли мы загрузить pandas DataFrame в .NET ironpython?

Печать серии фибоначчи

сканировать список сайтов один за другим с помощью scrapy

Как я могу захватить mouseevents и keyevents, используя python в фоновом режиме на linux

Как я могу создать псевдоним для атрибута non-function member в классе Python?

когда Python выделяет новую память для идентичных строк?

Как искать, если значение словаря содержит определенную строку с Python

pyqt4 QTextEdit – Как установитьMaxLength?

Есть ли библиотека Python для синтаксического анализа и управления кодом COBOL?

Получение ошибки Python "из: невозможно прочитать / var / mail / Bio"

Аутентификация Google appengine на веб-приложении iPhone на главном экране

Численное интегрирование Python с правилом Симпсона

конвертировать полный панда данных в целые числа в пандах (0.17.0)

Создание mTurk HIT из макета с параметрами с помощью boto и python

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