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 但可能会提到open
和 bytes
在 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编写格式化二进制文件