我是Python的新手。我的问题是: 我想对一个大文件匹配一个模式,并从中返回匹配的行(而不仅仅是匹配的字符串)。我不希望有FOR循环,因为我的文件很大。我正在使用 mmap 读取文件。
在上面的文件中,如果我搜索 bhuvi ,我应该得到2行, bhuvi 和 bhuvi Kumar
我为此使用了re.findall(),但它只是返回子字符串,而不是整行。
有人可以建议我在这里可以做什么吗?
答案 0 :(得分:1)
如果输入文件很大,则不能使用readlines
,但什么也不能使用
阻止您循环读取一个行。
由于 file 对象是可迭代的,因此可以将循环编写为:
for line in fh:
并在循环内处理输入行的内容。
文件大小并不重要,因为您不会尝试一次读取所有行。
要检查行中是否存在字符串(bhuvi
),请使用
re.search
,而不是re.findall
。
实际上,您不需要任何匹配项列表,足以找到
单个匹配(效果更快)。
下面有一个示例程序( Python 3.7 ),编写了包含您的代码行 字符串以及行号:
import re
cnt = 0
with open('input.txt') as fh:
for line in fh:
line = line.rstrip()
cnt += 1
if re.search('bhuvi', line):
print(f'{cnt}: {line}')
请注意,我使用rstrip()
删除了尾随的换行符。
您写道要检查的文件巨大。因此存在以下风险 如果您尝试整个将其读取到计算机内存中,则该程序 内存不足。
在这种情况下,您将必须逐块读取文件,然后 分别在每个块中执行搜索。
还有可能出现一行包含您要查找的文本的行 部分读入一个块,其余读入下一个, 因此您必须采取一些措施来避免程序中出现这种情况。
另一方面,如果除了使用 mmap 别无选择,
尝试类似re.finditer(r'[^\n]*bhuvi[^\n]*', map)
的方法,即创建
寻找以下内容的迭代器:
通过这种方式,迭代器返回的match对象将与 整行,而不是单独输入字符串。