微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python3与文件对象的兼容性

如何解决Python3与文件对象的兼容性

我有一个类/对象,它是Linux中一堆cmds的子过程。该对象具有以下内容

def __enter__(self):
    self.proc = subprocess.Popen(self.cmd,bufsize=-1,shell=True,stdout=subprocess.PIPE,executable="/bin/bash")
    return self.process.stdout 

这基本上返回了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,但是有没有一种更好的方法来实现每种情况而又没有完全不同的算法/逻辑?

解决方法

顶级内置函数next在Python 2和Python 3上均可使用,因此使用input_file.next()代替next(input_file)。至于一致地分割ASCII空格字符,只需在要分割的字符串上加上b前缀即可;它在Python 2上没有任何变化(b' '' '相同,在Python 2上均为str),在Python 3上,它变成了bytes对象二进制模式Popen进程产生)。

代码的最终版本是:

line = next(input_file).strip().split(b' ')

,并且在Python 2和Python 3上均相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。