向Python 2反向移植Python 3(encoding ="utf-8")

Mik*_*maa 144 python python-2.7 python-3.x

我有一个为Python 3构建的Python代码库,它使用带有编码参数的Python 3样式open():

https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47

    with open(fname, "rt", encoding="utf-8") as f:
Run Code Online (Sandbox Code Playgroud)

现在我想将这个代码反向移植到Python 2.x,这样我就可以拥有一个适用于Python 2和Python 3的代码库.

什么是解决open()差异和缺乏编码参数的推荐策略?

我可以使用Python 3 open()样式的文件处理程序来处理字节串,所以它会像Python 2一样open()吗?

Len*_*bro 166

1.要在Python 2中获取编码参数:

如果您只需要支持Python 2.6和2.7,则可以使用io.open而不是open.io是Python 3的新io子系统,它也存在于Python 2,6和2.7中.请注意,在Python 2.6(以及3.0)中,它仅在python中实现并且非常慢,因此如果您需要快速读取文件,那么它不是一个好的选择.

如果您需要速度,或者需要支持Python 2.5或更早版本,则可以使用codecs.open.它还有一个编码参数,io.open除了它以不同方式处理行结尾之外,它非常相似.

2.获取open()流式字节串的Python 3 样式文件处理程序:

open(filename, 'rb')
Run Code Online (Sandbox Code Playgroud)

注意'b',意思是'二进制'.

  • 'b'实际上是指二进制模式,而不是字节.请参阅https://docs.python.org/3/library/functions.html#open. (10认同)
  • @pmdarrow在这种情况下也是如此,但严格来说,是的. (5认同)
  • @ macmadness86您需要使用字节regexp表达式. (3认同)
  • 移植howto上的一条注释:“不要为使用codecs.open()而过时的做法打扰,因为只有这样才能保持与Python 2.5的兼容性。” https://docs.python.org/3/howto/pyporting.html (3认同)

mfu*_*ger 61

我认为

from io import open
Run Code Online (Sandbox Code Playgroud)

应该做.

  • 我认为Lennart在下面的回答要好得多,因为它提供了更多的解释和关于io模块在2.x中缓慢的警告以及使用codecs.open的建议. (7认同)
  • @matth在python3中,从io打开是内置打开的别名.请参阅https://docs.python.org/3/library/io.html?highlight=io#io.open (7认同)
  • 如果我在Python 3中使用`from io import open`会发生什么?我目前不关心表现. (2认同)

Fli*_*imm 20

这是一种方式:

with open("filename.txt", "rb") as f:
    contents = f.read().decode("UTF-8")
Run Code Online (Sandbox Code Playgroud)

  • 如果你对`f`有不同的计划,这显然不起作用 (4认同)

use*_*922 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)
Run Code Online (Sandbox Code Playgroud)

然后你可以用python3方式保存代码.

请注意,某些API,如newline,closefd,opener不工作