Alo*_*lon 13 python binary file python-3.x
我使用python 3我试图写二进制文件我用r + b.
for bit in binary:
fileout.write(bit)
Run Code Online (Sandbox Code Playgroud)
其中binary是包含数字的列表.如何用二进制文件将其写入文件?
结束文件必须看起来像b'x07\x08\x07 \
谢谢
pok*_*oke 33
当您以二进制模式打开文件时,您基本上使用该bytes
类型.因此,当您写入文件时,您需要传递一个bytes
对象,当您从中读取它时,您将获得一个bytes
对象.相反,在文本模式下打开文件时,您正在使用str
对象.
因此,编写"二进制"实际上是在写一个字节字符串:
with open(fileName, 'br+') as f:
f.write(b'\x07\x08\x07')
Run Code Online (Sandbox Code Playgroud)
如果您想要以二进制形式写入实际整数,则可以使用该bytes
函数将整数序列转换为字节对象:
>>> lst = [7, 8, 7]
>>> bytes(lst)
b'\x07\x08\x07'
Run Code Online (Sandbox Code Playgroud)
结合这一点,您可以将整数序列作为字节对象写入以二进制模式打开的文件中.
正如Hyperboreus在评论中指出的那样,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'
Run Code Online (Sandbox Code Playgroud)
因此,如果您有一个数字列表,您可以轻松地迭代它们并将每个数字写入文件中; 如果你想稍后单独提取数字,你可能想要添加一些东西来跟踪哪些字节属于哪些数字.
with open(fileName, 'br+') as f:
for number in numbers:
f.write(bytes(splitNumber(number)))
Run Code Online (Sandbox Code Playgroud)
Hyp*_*eus 13
其中binary是包含数字的列表
一个数字可以有一千零一个不同的二进制表示(endianess,width,1-complement,2-complement,不同精度的浮点数等).首先,您必须决定要存储数字的表示形式.然后您可以使用struct模块来执行此操作.
例如,字节序列0x3480可以解释为32820(little-endian unsigned short),或-32716(little-endian signed short)或13440(big-endian short).
小例子:
#! /usr/bin/python3
import struct
binary = [1234, 5678, -9012, -3456]
with open('out.bin', 'wb') as f:
for b in binary:
f.write(struct.pack('h', b)) #or whatever format you need
with open('out.bin', 'rb') as f:
content = f.read()
for b in content:
print(b)
print(struct.unpack('hhhh', content)) #same format as above
Run Code Online (Sandbox Code Playgroud)
版画
210
4
46
22
204
220
128
242
(1234, 5678, -9012, -3456)
Run Code Online (Sandbox Code Playgroud)