Python写二进制文件

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)

  • +1但可能提到`open`和`bytes`在2.x上表现不同 (8认同)
  • @Nande"r +"的行为是有意的.如果文件不存在,并非所有打开模式都会创建该文件.这不会使`r +`变得不那么有效;)`rw +`不是一个有效的模式顺便说一句,参见[文档](http://docs.python.org/3/library/functions.html#open )有关开放模式的更多信息. (2认同)

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)