在之前的Python 2程序中,我使用以下行将单个字节写入二进制文件:
self.output.write(chr(self.StartElementNew))
但是从Python 3开始,你不能将字符串和字符写入流而不先将它们编码为字节(这对于正确的多字节字符支持是有意义的)
现在有像byte(self.StartElementNew)这样的东西吗?如果可能的话,与Python 2兼容吗?
答案 0 :(得分:3)
对于0-127范围内的值,以下行将始终在Python 2(str
)和3(bytes
)中生成正确的类型:
chr(self.StartElementNew).encode('ascii')
这不适用于128-255范围内的值,因为在Python 2中,str.encode()
调用包含使用ASCII作为编解码器的隐式str.decode()
,这将失败。
对于0-255范围内的字节,我将定义一个单独的函数:
if sys.version_info.major >= 3:
as_byte = lambda value: bytes([value])
else:
as_byte = chr
然后在写单个字节时使用它:
self.output.write(as_byte(self.StartElementNew))
或者,使用six
library,它有six.int2byte()
function;该库为您进行Python版本测试,为您提供合适的函数版本:
self.output.write(six.int2byte(self.StartElementNew))
答案 1 :(得分:0)
另一种适用于Python 2和3的替代方法是使用struct
:
import struct
self.output.write(struct.pack('B', self.StartElementNew))