Python mmap使用正则表达式替换(替换)

时间:2016-01-04 21:46:02

标签: python regex replace mmap

所有Python向导,

我正在使用mmap将一个巨大的文件(最多8GB)读入内存,我想用正则表达式替换一些字符串,然后保存它。如何实现?

    >>> import mmap
    >>> import re
    >>> f = open('lorem.txt', 'r+')
    >>> m = mmap.mmap(f.fileno(), 0)
    >>> m.size()
    737

我遇到的问题是替换字符串比替换字符串短,所以当我尝试运行替换时,我收到错误消息IndexError: mmap slice assignment is wrong size

    >>> m[:] = re.sub('[Ll]orem', 'a', m[:])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: mmap slice assignment is wrong size

如果我尝试;

    >>> a = re.sub('[Ll]orem','a', m[:])
    >>> len(a)
    733
    >>> m.write(a)
    >>> m.flush(0,len(a))
    >>> m.size()
    737

如您所见,映射文件m的大小仍然相同。这意味着它与替代文本不同!

非常感谢任何帮助。 感谢。

2 个答案:

答案 0 :(得分:1)

事实证明,mmap()不能用于增加(或减少)文件的大小。 mmap()的功能是将内存映射到文件的一部分。 最简单的方法是在关闭之前将文件大小截断为新大小:

button.addEventListener("click", function () {
   ContactLoader.table(table);
});

如果您认为替换后文件大小会增加,那么只需在打开后增加其大小(例如加倍):

>>> f.truncate(len(a))
>>> f.close()

答案 1 :(得分:0)

如果您打算替换长度不同于起始长度的部分,则必须重新编写该文件。至少从字符串的开头到文件的结尾。

考虑使用较小文件的集合或其他允许变量长度的格式,这些变量可以由最终读取该文件的任何进程解释。