0

我想将二进制数据写入 Python 中的文件,而不先通过临时缓冲区发送。如何struct直接在文件上使用模块?

4

1 回答 1

3

这是我在 Python 3 下如何将二进制数据直接打包到文件中的方法。唯一的缺点是您需要在写入数据之前猜测文件的最大大小。truncate(如果猜测太大,可以在最后进行额外的调用。)

这里发生了两件事。该文件正在被内存映射,struct并被用于将数据打包到memoryview该内存映射的一个。通过使用 a memoryview,可以使用 Python 缓冲区接口直接写入文件。structpack_into函数可以写入任何支持缓冲区接口的东西。也可以通过memoryview在套接字上使用 a 将二进制数据直接写入套接字来使用此技术。

import struct
import mmap

with open('test.bin', 'wb') as f:
    f.truncate(100)

with open('test.bin', 'r+b') as f:
    m = mmap.mmap(f.fileno(), 0)
    mv = memoryview(m)
    for ind in range(25):
        struct.pack_into('>l', mv, ind * 4, ind)

另外,请注意,对 进行更少的调用可能会更好,pack_into此处在循环中调用它仅用于说明目的。

于 2012-06-29T20:57:33.617 回答