在python中,有没有办法让re.finditer将文件作为输入而不是字符串?

Mat*_*att 4 python regex file-io

假设我有一个非常大的文件foo.txt,我希望在找到正则表达式时迭代它.目前我这样做:

f = open('foo.txt')
s = f.read()
f.close()
for m in re.finditer(regex, s):
    doSomething()
Run Code Online (Sandbox Code Playgroud)

有没有办法在不必将整个文件存储在内存中的情况下执行此操作?

注意:逐行读取文件不是一个选项,因为正则表达式可能跨越多行.

更新:stdin如果可能的话,我也希望这样做.

更新:我正在考虑以某种方式使用自定义文件包装器模拟字符串对象,但我不确定正则表达式函数是否会接受自定义的类似字符串的对象.

小智 5

您必须以块为单位读取文件,使用重叠以允许表达式的最大可能长度,或者使用mmapped文件,这几乎/就像使用流一样好:https:// docs. python.org/library/mmap.html

UPDATE到你的UPDATE:认为stdin不是一个文件,它只是表现得很像一个文件描述符等等.它是一个posix流.如果你不清楚差异,做一些谷歌搜索.操作系统无法mmap它,因此python不能.

还要考虑你正在做的事情可能是一个不适合使用正则表达式的东西.正则表达式非常适合捕获小东西,比如解析连接字符串,日志条目,csv数据等等.它们不是解析大量数据的好工具.这是设计的.你可能最好写一个自定义解析器.

过去的一些智慧词:http: //regex.info/blog/2006-09-15/247


kin*_*all 5

如果可以将正则表达式可以跨越的行数限制为某个合理的数量,则可以使用a collections.deque在文件上创建滚动窗口,并在内存中仅保留该行数.

from collections import deque

def textwindow(filename, numlines):
    with open(filename) as f:
        window   = deque((f.readline() for i in xrange(numlines)), maxlen=numlines)
        nextline = True
        while nextline:
            text = "".join(window)
            yield text
            nextline = f.readline()
            window.append(nextline)

 for text in textwindow("bigfile.txt", 10):
     # test to see whether your regex matches and do something
Run Code Online (Sandbox Code Playgroud)

  • 在那种情况下,yeahp,你将不得不阅读整个文件. (2认同)