当您以二进制模式打开文件时,您实际上是在使用bytes 类型。所以当你写入文件时,你需要传递一个bytes 对象,当你从它读取时,你会得到一个bytes 对象。相反,当以文本模式打开文件时,您使用的是str 对象。
所以,写“二进制”其实就是写字节串:
with open(fileName, 'br+') as f:
f.write(b'\x07\x08\x07')
如果您有实际的整数想要写成二进制,您可以使用bytes 函数将整数序列转换为字节对象:
>>> lst = [7, 8, 7]
>>> bytes(lst)
b'\x07\x08\x07'
结合这一点,您可以将整数序列作为字节对象写入以二进制模式打开的文件中。
正如 Hyperboreus 在 cmets 中指出的那样,bytes 将只接受实际上适合一个字节的数字序列,即 0 到 255 之间的数字。如果您想以它们的方式存储任意(正)整数,而不必费心知道它们的确切大小(这是结构所必需的),那么您可以轻松编写一个辅助函数,将这些数字分成单独的字节:
def splitNumber (num):
lst = []
while num > 0:
lst.append(num & 0xFF)
num >>= 8
return lst[::-1]
bytes(splitNumber(12345678901234567890))
# b'\xabT\xa9\x8c\xeb\x1f\n\xd2'
因此,如果您有一个数字列表,则可以轻松地遍历它们并将每个数字写入文件;如果您想稍后单独提取数字,您可能需要添加一些东西来跟踪哪些单个字节属于哪些数字。
with open(fileName, 'br+') as f:
for number in numbers:
f.write(bytes(splitNumber(number)))