当前位置: 代码迷 >> python >> 在 Python3 中不使用 FOR 的模式匹配后返回一个巨大文件的确切行
  详细解决方案

在 Python3 中不使用 FOR 的模式匹配后返回一个巨大文件的确切行

热度:163   发布时间:2023-06-19 09:16:42.0

我是 Python 的新手。 我的问题是:我想将一个模式与一个大文件进行匹配,并从中返回匹配的行(不仅仅是匹配的字符串)。 我不想为此使用 FOR 循环,因为我的文件很大。 我正在使用mmap来读取文件。

在上面的文件中,如果我搜索bhuvi ,我应该得到 2 行, bhuvibhuvi Kumar

我为此使用了 re.findall(),但它只返回子字符串,而不是整行。

有人可以建议我在这里做什么吗?

如果输入文件是巨大的,你不能使用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) ,即创建一个迭代器寻找:

  1. \\n之外的字符序列。
  2. 你的字符串。
  3. \\n之外的另一个字符序列。

这样迭代器返回的匹配对象将匹配整行,而不是单独的字符串。

  相关解决方案