代码之家  ›  专栏  ›  技术社区  ›  Mayank Porwal

在模式匹配后返回大文件的精确行,而不在python3中使用for

  •  0
  • Mayank Porwal  · 技术社区  · 6 年前

    我是巨蟒的新手。我的问题是: 我想将一个模式与一个大文件匹配,并从中返回匹配的行(而不仅仅是匹配的字符串)。我不希望有一个for循环,因为我的文件很大。我正在使用 MMAP 用于读取文件。

    Sample File

    在上面的文件中,如果我搜索 布维 ,我应该有两排, 布维 布维·库马尔

    我用re.findall()来表示,但它只返回子字符串,而不是整行。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Valdi_Bo    6 年前

    如果输入文件很大,则不能使用 readlines ,但什么都没有 阻止你阅读 循环中的一行。

    作为 文件 对象是可初始化的,您可以将循环写为:

    for line in fh:
    

    处理循环内输入行的内容。

    文件大小并不重要,因为您不会试图一次读取所有行。

    检查您的字符串是否存在( bhuvi )在线使用 re.search 不是 re.findall . 实际上你不需要任何匹配的列表,这就足够找到 一 单一的 匹配(它工作得更快)。

    下面是一个示例程序( 蟒蛇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 .

    这样,迭代器返回的match对象将与 整条线 不是只有你的绳子。