Python如何写入二进制文件?

Aar*_*ker 106 python

我有一个字节列表作为整数,这是类似的

[120, 3, 255, 0, 100]
Run Code Online (Sandbox Code Playgroud)

如何将此列表作为二进制文件写入文件?

这会有用吗?

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 109

这正是bytearray为了:

newFileByteArray = bytearray(newFileBytes)
newFile.write(newFileByteArray)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 3.x,则可以使用bytes(也可能应该使用,因为它可以更好地表明您的意图).但是在Python 2.x中,这不起作用,因为bytes它只是一个别名str.像往常一样,使用交互式解释器显示比使用文本解释更容易,所以让我这样做.

Python 3.x:

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
b'{\x03\xff\x00d'
Run Code Online (Sandbox Code Playgroud)

Python 2.x:

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
'[123, 3, 255, 0, 100]'
Run Code Online (Sandbox Code Playgroud)

  • @Perkins:当然,如果你需要使用2.3,你应该避免使用生成器表达式,如果需要使用2.2,请小心使用`str.encode`和`struct.pack`.但是2.6已经出现了5年了; 所有三个Ubuntu LTS仍然支持,所有三个OS X版本都支持,以前的主要版本的CentOS/RHEL等都附带它内置.如果你需要支持2.5或2.1或1.6或其他什么,你可能知道… (6认同)
  • @feersum:当然; 这是2.x中的二进制与文本模式_means_的关系.你的字节来自什么类型并不重要.(在3.x中,当然,二进制与文本模式意味着您编写字节与unicode,而`\ r \n`功能是文本的通用换行选项的一部分.) (6认同)
  • 在Windows上使用Python 2,我发现写一个`bytearray`仍会将`\n`转换为`\ r \n`,如果在打开文件时没有传递"b"标志,则二进制数据不能令人满意. (4认同)

Mar*_*som 26

使用struct.pack的整数值转换成二进制字节,然后写入字节.例如

newFile.write(struct.pack('5B', *newFileBytes))
Run Code Online (Sandbox Code Playgroud)

但是,我永远不会给二进制文件一个.txt扩展名.

这种方法的好处是它也适用于其他类型,例如,如果任何值大于255,您可以使用'5i'该格式来获得完整的32位整数.

  • @MarkRansom:嗯,这仍然绝对是解决“我有一个任意但固定大小的整数列表,如何将它们写入二进制文件?”的更普遍问题的一个很好的解决方案。我可以看到人们在搜索这个问题并找到这个问题...... (2认同)
  • struct.pack 是更好的答案;它比简单地创建一个字节数组灵活得多。 (2认同)

Per*_*ins 8

要将整数<256转换为二进制,请使用该chr函数.所以你正在考虑做以下事情.

newFileBytes=[123,3,255,0,100]
newfile=open(path,'wb')
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('charmap'))
Run Code Online (Sandbox Code Playgroud)

  • 不,我的意思是&lt;256,但是编码应该是`charmap`而不是`ascii`,并且可以在python2和python3中使用。`ascii`编码仅在python2中有效。 (2认同)

ken*_*orb 7

您可以使用以下使用Python 3语法的代码示例:

from struct import pack
with open("foo.bin", "wb") as file:
  file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))
Run Code Online (Sandbox Code Playgroud)

这是外壳一线:

python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'
Run Code Online (Sandbox Code Playgroud)


Cre*_*oat 7

从Python 3.2+开始,您还可以使用to_bytesnative int方法完成此操作:

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
for byte in newFileBytes:
    newFile.write(byte.to_bytes(1, byteorder='big'))
Run Code Online (Sandbox Code Playgroud)

也就是说,to_bytes在这种情况下,每次调用都会创建一个长度为1的字符串,其字符以big-endian顺序排列(对于长度为1的字符串来说这是微不足道的),它表示整数值byte.您还可以将最后两行缩短为一行:

newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))
Run Code Online (Sandbox Code Playgroud)