Обратная передача 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не работают