问题描述
我是 Python 的新手。 我的问题是:我想将一个模式与一个大文件进行匹配,并从中返回匹配的行(不仅仅是匹配的字符串)。 我不想为此使用 FOR 循环,因为我的文件很大。 我正在使用mmap来读取文件。
在上面的文件中,如果我搜索bhuvi ,我应该得到 2 行, bhuvi和bhuvi Kumar
我为此使用了 re.findall(),但它只返回子字符串,而不是整行。
有人可以建议我在这里做什么吗?
1楼
如果输入文件是巨大的,你不能使用readlines
,但没有阻止你读一行在一个循环。
由于文件对象是可迭代的,您可以将循环编写为:
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)
,即创建一个迭代器寻找:
- 除\\n之外的字符序列。
- 你的字符串。
- 除\\n之外的另一个字符序列。
这样迭代器返回的匹配对象将匹配整行,而不是单独的字符串。