Бэкпортирование открытого Python 3 (encoding = «utf-8») в Python 2

У меня есть кодовая база Python, созданная для Python 3, которая использует стиль Python 3 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 3open() обработчик файла стиля, который передает потоковые строки, поэтому он будет действовать как Python 2open()?

Ответы на вопрос(4)

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

with open("filename.txt", "rb") as f:
    contents = f.read().decode("UTF-8")
 user535953104 дек. 2018 г., 20:21
это, очевидно, не работает, если у вас были разные планы наf
Решение Вопроса
1. Чтобы получить параметр кодировки в Python 2:

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

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

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

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

 pmdarrow09 окт. 2014 г., 20:34
«B» означает двоичный режим, а не байты. Видеть Docs.python.org / 3 / библиотека / functions.html # @ открыт.
 Lennart Regebro11 июн. 2015 г., 08:53
@ macmadness86 Вы должны использовать выражение регулярного выражения байтов.
 Jonathan Komar10 июн. 2015 г., 17:37
Я столкнулся с проблемой, что вы не можете запустить регулярное выражение через поток байтов для варианта 2;)
 Al Sweigart05 сент. 2018 г., 22:34
Примечание из инструкции по переносу: «Не беспокойтесь об устаревшей практике использования codecs.open (), поскольку это необходимо только для обеспечения совместимости с Python 2.5». Docs.python.org / 3 / HOWTO / pyporting.html
 Lennart Regebro13 окт. 2014 г., 10:02
@ pmdarrow То же самое в этом случае, но, строго говоря, да.

Это может сработать:

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

 bfontaine11 янв. 2019 г., 23:55
ты можешь отменить условие, чтобы избежать этогоpass.

Я дума

from io import open

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

 matth06 июл. 2016 г., 16:17
Что произойдет, если я используюfrom io import open в Python 3? Я не забочусь о производительности в настоящее время.
 gps11 июн. 2012 г., 21:10
Я думаю, что приведенный ниже ответ Леннарта намного лучше, так как он дает больше объяснений и предостережения относительно медлительности модуля io в 2.x вместе с предложением использовать codecs.open.
 mfussenegger06 июл. 2016 г., 22:27
@ matth В python3 open от io - псевдоним для встроенного open. Видеть Docs.python.org / 3 / библиотека / io.html? Изюминка = ю # io.open

Ваш ответ на вопрос