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
如果可以将正则表达式可以跨越的行数限制为某个合理的数量,则可以使用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)