如何在Python中将整数列表写入二进制文件

3

我有一个整数列表,这些整数代表代码的字节。如何快速高效地将它们写入二进制文件。

我尝试过以下方法:

with open (output1, "wb") as compdata:
    for row in range(height):
        for data in cobs(delta_rows[row].getByte_List()):
            output_stream.append(Bits(uint=data, length=8))
    compdata.write(output_stream.tobytes())

and

with open (output1, "wb") as compdata:
    for row in range(height):
        bytelist = cobs(delta_rows[row].getByte_List())
        for byte in bytelist:
            compdata.write(chr(byte))

两种方法都给出了我认为是正确的结果(我还没有反向过程),但两种方法都需要很长时间(分别为6分钟和4分钟)。


这是Python 2还是3? - Martijn Pieters
抱歉,Python 2(具体为2.7.5版本)已经过时。 - Marmstrong
你看过struct.Pack吗?它允许你将二进制数据写入字符串(和文件)。http://docs.python.org/2/library/struct.html - user632657
首先,每行只写一次可以提高性能。但是,stream.to_bytes()调用是否也会清除它?否则,你就会进入指数级的领域...例如,你添加[1,2,3]。你将[1]添加到output_stream中,然后写入它。然后你附加2,output_stream现在是[1,2],你写入它。然后你附加3,output_stream现在是[1,2,3],你写入它。 - Corley Brigman
@CorleyBrigman 是的,当我在SE上写下来时,我的缩进有误。这两个代码段输出完全相同的数据。 - Marmstrong
1个回答

9

使用 bytearray() 对象,直接将其写入输出文件:

with open (output1, "wb") as compdata:
    for row in range(height):
        bytes = bytearray(cobs(delta_rows[row].getByte_List()))
        compdata.write(bytes)

一个整数序列被 bytearray() 解释为一串字节值。
在 Python 3 中,你也可以使用一个bytes() 类型,使用相同的输入;毕竟,你不会在创建后改变这些值。

我已经尝试在我的代码中实现了这个解决方案,它的实现时间也只有4分钟。这是一段很好的代码,比使用位串更适合这种情况。 - Marmstrong
1
在某个时刻,您必须弄清楚cobs(delta_rows[row].getByte_List())占用了多少时间;bytesarray()调用将结果的转换完全转化为C代码,因此这可能是其能够做到的最快的速度。 - Martijn Pieters
这个调用需要0.111秒,乘以2159次调用=239秒或4分钟。你是对的。 - Marmstrong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接