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

4 116

4 ответа:

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

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

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

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

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