Python mmap 使用正则表达式替换(替换)
Python mmap replace (substitute) using regex
你们所有 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 仍然具有相同的大小。这意味着它与替换文本不同!
非常感谢任何帮助。
谢谢。
如果您打算替换长度不同于起始长度的部分,则必须 re-write 文件。至少从字符串的开头到文件的结尾。
考虑使用较小文件的集合或其他允许可变长度的格式,最终读取该文件的任何进程都可以解释这些长度。
事实证明,mmap() 不能用于增加(或减少)文件的大小。 mmap()的作用是对文件的一部分进行内存映射。
最简单的方法是在关闭文件之前将文件大小截断为新大小:
>>> f.truncate(len(a))
>>> f.close()
如果您认为替换后文件大小会增加,则打开后只需增加其大小(例如加倍)即可:
>>> f = open('lorem.txt', 'r+')
>>> f.truncate(os.path.getsize('lorem.txt') * 2)
>>> m = mmap.mmap(f.fileno(), 0)
>>> m.size()
1474
你们所有 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 仍然具有相同的大小。这意味着它与替换文本不同!
非常感谢任何帮助。 谢谢。
如果您打算替换长度不同于起始长度的部分,则必须 re-write 文件。至少从字符串的开头到文件的结尾。
考虑使用较小文件的集合或其他允许可变长度的格式,最终读取该文件的任何进程都可以解释这些长度。
事实证明,mmap() 不能用于增加(或减少)文件的大小。 mmap()的作用是对文件的一部分进行内存映射。 最简单的方法是在关闭文件之前将文件大小截断为新大小:
>>> f.truncate(len(a))
>>> f.close()
如果您认为替换后文件大小会增加,则打开后只需增加其大小(例如加倍)即可:
>>> f = open('lorem.txt', 'r+')
>>> f.truncate(os.path.getsize('lorem.txt') * 2)
>>> m = mmap.mmap(f.fileno(), 0)
>>> m.size()
1474