将数据添加到大文件的开头或中间
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 系统上”)。
我需要追加到二进制文件的开头或中间,该文件可能很大(从 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 系统上”)。