覆盖文件的第n个字节

时间:2016-04-12 16:52:12

标签: python file

在python中,编辑文件中间部分的常规方法通常包括获取文件的第一部分,添加所需内容,然后在后半部分中添加减去您编辑的字节数。我的问题是,有没有什么方法可以打开文件,只编辑某些字节而不将整个文件加载到内存中,还可以从文件读取字节而不将整个文件加载到内存中。我将要编辑的文件非常大,因此将它们加载到变量中是缓慢且无效的

1 个答案:

答案 0 :(得分:2)

你可以seek然后write,但经常寻找和写作并不是那么直观 - 特别是如果你需要修改值(在12345678加1到字节) );还有write s,read移动指针,或者您需要将bytes([value])的字节值实际变为write,依此类推。

如果你有一台64位电脑; 64位操作系统和64位Python - 您可以将所有这些位使用,并使用mmap模块将整个文件映射到虚拟内存中;使用mmap,您可以像bytearray一样访问您的文件(Python 3):

with open("big.data", "r+b") as f:
    # memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(), 0)
    # write byte 42 to position 12345678
    mm[12345678] = 42
    # add 1 to byte at position 12345679
    mm[12345679] += 1
    mm.close()

(在Python 2中,元素是长度为1的8位字符串,因此您需要使用chr(42)等等)

在32位计算机上,小虚拟内存将可以通过这种方式操作的文件的最大大小限制为千兆字节甚至更小;在64位计算机上,可以假设您没有太大的文件无法映射。

P.S。 mmap is also very nice for reading big data