在Python3.x中向文件写入一个字节

在Python3.x中向文件写入一个字节,python,file,stream,binary,Python,File,Stream,Binary,在前面的Python 2程序中,我使用以下行将单个字节写入二进制文件: self.output.write(chr(self.StartElementNew)) 但是自从Python3以来,如果不先将字符串和字符编码为字节,就不能将它们写入流(这对于正确的多字节字符支持是有意义的) 现在是否有诸如byte(self.StartElementNew)之类的内容?如果可能,与Python 2兼容?对于0-127范围内的值,以下行将始终在Python 2(str)和3(bytes)中生成正确的类型:

在前面的Python 2程序中,我使用以下行将单个字节写入二进制文件:

self.output.write(chr(self.StartElementNew))
但是自从Python3以来,如果不先将字符串和字符编码为字节,就不能将它们写入流(这对于正确的多字节字符支持是有意义的)


现在是否有诸如byte(self.StartElementNew)之类的内容?如果可能,与Python 2兼容?

对于0-127范围内的值,以下行将始终在Python 2(
str
)和3(
bytes
)中生成正确的类型:

这对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(six.int2byte(self.StartElementNew))
然后在写入单个字节时使用:

self.output.write(as_byte(self.StartElementNew))
或者,使用,它有一个;库会为您进行Python版本测试,为您提供合适的函数版本:

if sys.version_info.major >= 3:
    as_byte = lambda value: bytes([value])
else:
    as_byte = chr
self.output.write(six.int2byte(self.StartElementNew))

另一种与Python 2和3配合使用的方法是使用
struct

import struct
self.output.write(struct.pack('B', self.StartElementNew))

@galinette:是的,恐怕在编写多语言代码时,捕捉
importorror
namererror
并不是什么都能做到的。