将数据添加到大文件的开头或中间

Add data to the begining or middle of large files

我需要追加到二进制文件的开头或中间,该文件可能很大(从 100Mb 到 15Gb 不等)。到目前为止,我看到的大多数答案要么不适合大文件,要么基本上完全重写文件。希望尽可能避免使用 "writing to a new file and replacing old file" 方法。在我看来,像这样的东西应该能够从例如第 60 个字节添加数据:

with open('file.dat', 'ab') as f:
    f.seek(60)
    f.write(b'_hello_world_')

但是它没有按预期工作,而是附加到文件末尾。我仍然在思考前面的例子是如何失败的,但使用 io.BytesIO() 的方式是一样的。希望我只是忽略了一些简单的事情。

文件模式参数a明确表示a在行尾添加文本,see documentation:

and 'a' for appending (which on some Unix systems, means that all writes append to the end of the file regardless of the current seek position)

因此,如果您将 a 用作文件模式参数,则查找无济于事。但您不必使用 a。只需使用 r+ 代替,这意味着打开文件也可以更新它(读和写):

with open('file.dat', 'r+b') as f:
    f.seek(60)
    f.write(b"_hello_world_")    

我仍然不确定 Windows 是否也是这种情况(文档说“在某些 Unix 系统上”)。