Python编写二进制

Posted

技术标签:

【中文标题】Python编写二进制【英文标题】:Python writing binary 【发布时间】:2014-01-24 04:27:57 【问题描述】:

我使用 python 3 我尝试将二进制文件写入我使用 r+b 的文件。

for bit in binary:
    fileout.write(bit)

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

最终文件必须看起来像 b' x07\x08\x07\

谢谢

【问题讨论】:

这里的“二进制”应该是什么意思?你想要 1 和 0? Read and write binary file in Python 的可能重复项 【参考方案1】:

当您以二进制模式打开文件时,您实际上是在使用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)))

【讨论】:

+1 但可能会提到 openbytes 在 2.x 上的行为不同 @wim OP 说他们正在使用 Python 3;现在也将标签添加到问题中。 (猜猜我们俩同时这样做了^^) 是的,我只是在同一时刻注意到并标记了它!现在我在历史上有一个编辑,实际上没有任何改变 第一次打开时不应该使用“w+b”吗? (注意 w) @Nande r+ 的这种行为是有意的。如果文件不存在,并非所有打开模式都会创建该文件。但这并没有使r+ 的有效性降低;)rw+ 不是有效模式顺便说一句。有关开放模式的更多信息,请参阅the docs。【参考方案2】:

其中 binary 是一个包含数字的列表

一个数字可以有一千零一种不同的二进制表示(字节序、宽度、1-补码、2-补码、不同精度的浮点数等)。因此,首先您必须决定要以哪种表示形式存储您的数字。然后您可以使用struct 模块来执行此操作。

例如,字节序列 0x3480 可以解释为 32820(小端无符号短)、-32716(小端有符号短)或 13440(大端短)。

小例子:

#! /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)

【讨论】:

以上是关于Python编写二进制的主要内容,如果未能解决你的问题,请参考以下文章

python 从Pandas Dataframe编写格式化二进制文件

python 从Pandas Dataframe编写格式化二进制文件

python 从Pandas Dataframe编写格式化二进制文件

python 从Pandas Dataframe编写格式化二进制文件

用Python 3.1.3 写几个进制转换的程序

在python中打开由c程序编写为1和0的16位整数的二进制文件