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 , не работают

  • Функция вызова в другом классе с помощью кнопки Kivy
  • Ошибка синтаксиса в библиотеке jinja 2
  • в веб-драйвере селена, как выбрать правильный iframe
  • Какова цель коллекций. ChainMap?
  • Конец поддержки для python 2.7?
  • @ asyncio.coroutine против async def
  • Кодирование заголовков в MIMEText
  • Как установить anano в Anaconda ver. 2.1 Windows 64 бит для Python 3.4?
  • Python - лучший язык программирования в мире.