Py学习  »  Python

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

Mayank Porwal • 4 年前 • 656 次点击  

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

Sample File

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38093
 
656 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Valdi_Bo
Reply   •   1 楼
Valdi_Bo    5 年前

如果输入文件很大,则不能使用 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对象将与 整条线 不是只有你的绳子。