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

  • Импорт bs4 в Python 3.5
  • Невозможный lookbehind с обратной рецензией
  • Как бы я превратил число в его двоичное представление?
  • Проблемы с крючками с использованием запросов Пакет Python
  • Является ли Python 3.3 лучше, чем 2,7 для декодирования и повторного кодирования Скребковый веб-текст для UTF-8? Как, намного лучше?
  • Не удается распечатать определенную строку из текстового файла
  • chr () эквивалент, возвращающий объект байтов, в py3k
  • Ошибка импорта scipy.linalg в windows (python 3.3)
  • Использование __class__ для создания экземпляров
  • Python 3 - при преобразовании из ints в 'bytes', а затем их конкатенации (для последовательной передачи)
  • Где виртуальные рабочие идут в производство?
  • Python - лучший язык программирования в мире.