python - 在 mmap 文件中删除/插入数据

标签 python insert mmap

我正在使用 Python 编写一个脚本,该脚本映射一个文件以使用 mmap() 进行处理。

任务要求我更改文件的内容

  1. 替换数据
  2. 将数据添加到文件中的偏移量
  3. 从文件中删除数据(而不是将其删除)

只要旧数据和新数据具有相同的字节数,替换数据就非常有效:

VDATA = mmap.mmap(f.fileno(),0)
start = 10
end = 20
VDATA[start:end] = "0123456789"

但是,当我尝试删除数据(用“”替换范围)或插入数据(用比范围长的内容替换范围)时,我收到错误消息:

IndexError: mmap slice assignment is wrong size

这是有道理的。

现在的问题是,如何从映射文件中插入和删除数据? 通过阅读文档,我似乎可以使用一系列低级操作来回移动文件的全部内容,但如果有更简单的解决方案,我宁愿避免这种情况。

最佳答案

由于没有替代方案,我继续编写了两个辅助函数 - deleteFromMmap() 和 insertIntoMmap() - 来处理低级文件操作并简化开发。

关闭和重新打开 mmap 而不是使用 resize() 是为了解决 unix 上 python 派生导致 resize() 失败的错误。 (http://mail.python.org/pipermail/python-bugs-list/2003-May/017446.html)

函数包含在一个完整的示例中。 全局的使用是由于主项目的格式,但您可以轻松地调整它以匹配您的编码标准。

import mmap

# f contains "0000111122223333444455556666777788889999"

f = open("data","r+")
VDATA = mmap.mmap(f.fileno(),0)

def deleteFromMmap(start,end):
    global VDATA
    length = end - start
    size = len(VDATA)
    newsize = size - length

    VDATA.move(start,end,size-end)
    VDATA.flush()
    VDATA.close()
    f.truncate(newsize)
    VDATA = mmap.mmap(f.fileno(),0)

def insertIntoMmap(offset,data):
    global VDATA
    length = len(data)
    size = len(VDATA)
    newsize = size + length

    VDATA.flush()
    VDATA.close()
    f.seek(size)
    f.write("A"*length)
    f.flush()
    VDATA = mmap.mmap(f.fileno(),0)

    VDATA.move(offset+length,offset,size-offset)
    VDATA.seek(offset)
    VDATA.write(data)
    VDATA.flush()

deleteFromMmap(4,8)

# -> 000022223333444455556666777788889999

insertIntoMmap(4,"AAAA")

# -> 0000AAAA22223333444455556666777788889999

关于python - 在 mmap 文件中删除/插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917047/

相关文章:

python - Spark worker 不断删除和添加执行程序

python 无需步行即可检测新文件

python - 如何使用 ssh-ed25519 作为 pysftp 的 key 设置主机 key 文件

Python 3 : Getting TypeError: Slices must be integers. .. 但我相信它们

php - 为什么从 php 到 mysql 的插入有时会错误处理问号,但从命令行从来没有?

sql-server - Oracle 从函数插入

C 将带有 memcpy 和 mmap 文件的文件复制到 RAM

使用自定义键的 C++ map 插入失败

c - 复杂类型的 mmap 问题

c++ - 类似于 mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);在窗口中