当前位置:  开发笔记 > 编程语言 > 正文

如何在不将内容全部读入内存的情况下对整个文件进行重新搜索或重新匹配?

如何解决《如何在不将内容全部读入内存的情况下对整个文件进行重新搜索或重新匹配?》经验,为你挑选了2个好方法。

我希望能够在整个文件上运行正则表达式,但我希望能够不必立即将整个文件读入内存,因为将来可能会使用相当大的文件.有没有办法做到这一点?谢谢!

澄清:我无法逐行阅读,因为它可以跨越多行.



1> sth..:

您可以使用mmap将文件映射到内存.然后可以像普通字符串一样访问文件内容:

import re, mmap

with open('/var/log/error.log', 'r+') as f:
  data = mmap.mmap(f.fileno(), 0)
  mo = re.search('error: (.*)', data)
  if mo:
    print "found error", mo.group(1)

这也适用于大文件,文件内容根据需要从磁盘内部加载.


请注意:如果您使用32位系统*并且*您的文件可能超过1 GiB,则此方法可能无效.
这会导致Python 3出现问题,因为str/bytes不匹配(`TypeError:不能在类字节对象上使用字符串模式`),所以你的正则表达式需要是二进制的(eew)
模式可以是字节式的...所以只需使用`b'pattern'`

2> Andrew Hare..:

这取决于文件和正则表达式.您可以做的最好的事情是逐行读取文件,但如果这对您的情况不起作用,则可能会因将整个文件拉入内存而陷入困境.

让我们说例如这是你的文件:

Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Ut fringilla pede blandit
eros sagittis viverra. Curabitur facilisis
urna ABC elementum lacus molestie aliquet.
Vestibulum lobortis semper risus. Etiam
sollicitudin. Vivamus posuere mauris eu
nulla. Nunc nisi. Curabitur fringilla fringilla
elit. Nullam feugiat, metus et suscipit
fermentum, mauris ipsum blandit purus,
non vehicula purus felis sit amet tortor.
Vestibulum odio. Mauris dapibus ultricies
metus. Cras XYZ eu lectus. Cras elit turpis,
ultrices nec, commodo eu, sodales non, erat.
Quisque accumsan, nunc nec porttitor vulputate,
erat dolor suscipit quam, a tristique justo
turpis at erat.

这是你的正则表达式:

consectetur(?=\sadipiscing)

现在这个正则表达式使用正向前瞻,并且只会匹配一串"consectetur",如果它后面紧跟任何空白字符,然后是一串"adipiscing".

因此,在此示例中,您必须将整个文件读入内存,因为正则表达式取决于整个文件被解析为单个字符串.这是许多示例中需要您将整个字符串保留在内存中以使特定正则表达式工作的示例之一.

我想不幸的答案是,这一切都取决于你的情况.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有