Обратная передача 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 ответа:
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', что означает'байты'.
это может сделать трюк:
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
не работают