Python3 与文件对象的兼容性
Python3 compatability with file object
我有一个 class/object,它是 linux 中一堆命令的子进程。该对象类似于:
def __enter__(self):
self.proc = subprocess.Popen(self.cmd, bufsize=-1, shell=True, stdout=subprocess.PIPE, executable="/bin/bash")
return self.process.stdout
这基本上是 return Python2 中的 file
对象和 Python3 中的 _io.BufferedReader
对象。
我在每一行上执行一堆逻辑并创建一堆生成器。同时支持 python 2 和 3 的最佳方法是什么。例如,如果我有类似
的东西
line = input_file.next().strip().split(' ')
与 Python 2 一起工作,但对于 Python 3 我会得到类似
的东西
`_io.BufferedReader` object has no attribute 'next'
如果我将 input_file.next()
更新为 input_file.readline()
,我会收到以下错误:
a bytes-like object is required, not 'str'
我可以继续相应地更新它以适用于 Python3,但是有没有更好的方法来做到这一点而不会在每种情况下完全不同 algo/logic?
top-level built-in 函数 next
适用于 Python 2 和 Python 3,所以不用 input_file.next()
使用 next(input_file)
。至于始终按 ASCII space 字符拆分,只需在要拆分的字符串上加上 b
前缀即可;它在 Python 2 上没有任何变化(b' '
与 ' '
相同,在 Python 2 上都是 str
),在 Python 3 上,它使它成为一个 bytes
对象(二进制模式 Popen
进程产生)。
代码的最终版本是:
line = next(input_file).strip().split(b' ')
并且在 Python 2 和 Python 3 上工作相同。
我有一个 class/object,它是 linux 中一堆命令的子进程。该对象类似于:
def __enter__(self):
self.proc = subprocess.Popen(self.cmd, bufsize=-1, shell=True, stdout=subprocess.PIPE, executable="/bin/bash")
return self.process.stdout
这基本上是 return Python2 中的 file
对象和 Python3 中的 _io.BufferedReader
对象。
我在每一行上执行一堆逻辑并创建一堆生成器。同时支持 python 2 和 3 的最佳方法是什么。例如,如果我有类似
的东西line = input_file.next().strip().split(' ')
与 Python 2 一起工作,但对于 Python 3 我会得到类似
的东西`_io.BufferedReader` object has no attribute 'next'
如果我将 input_file.next()
更新为 input_file.readline()
,我会收到以下错误:
a bytes-like object is required, not 'str'
我可以继续相应地更新它以适用于 Python3,但是有没有更好的方法来做到这一点而不会在每种情况下完全不同 algo/logic?
top-level built-in 函数 next
适用于 Python 2 和 Python 3,所以不用 input_file.next()
使用 next(input_file)
。至于始终按 ASCII space 字符拆分,只需在要拆分的字符串上加上 b
前缀即可;它在 Python 2 上没有任何变化(b' '
与 ' '
相同,在 Python 2 上都是 str
),在 Python 3 上,它使它成为一个 bytes
对象(二进制模式 Popen
进程产生)。
代码的最终版本是:
line = next(input_file).strip().split(b' ')
并且在 Python 2 和 Python 3 上工作相同。