Python写二进制文件

时间:2014-01-06 17:21:30

标签: python file python-3.x binary

我使用python 3 我试着写二进制文件我用r + b。

for bit in binary:
    fileout.write(bit)

其中binary是包含数字的列表。 如何用二进制文件将其写入文件?

结束文件必须看起来像 b'x07 \ x08 \ x07 \

由于

2 个答案:

答案 0 :(得分:31)

以二进制模式打开文件时,您基本上使用的是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在评论中指出的那样,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)))

答案 1 :(得分: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

打印

210
4
46
22
204
220
128
242
(1234, 5678, -9012, -3456)