【问题标题】:parsing a huge text file and obtaining next and previous lines after match解析一个巨大的文本文件并在匹配后获取下一行和上一行
【发布时间】:2015-03-19 16:02:45
【问题描述】:

我有一个大约 500 MB 的巨大文本文件,我需要打印与输入匹配的行,以及前 3 行和后 3 行。

我的文本文件如下所示:

...
...
...
benz is a nice car
...
...
...
its also said benz is a safe car
...
...
...

如果用户输入为“benz”,那么它应该为每个单独的匹配打印匹配前后的 3 行。

我的代码:-

users= raw_input('enter the word:')
with open('mytext.txt',rb) as f:
     for line if f:
         if users in line:
            print line(i-3)
            print line
            print line(i+3)

但是我没有定义的错误

【问题讨论】:

  • 正如@Lutz Horn 所建议的,grep 是一个不错的选择。自己做,你会用不必要的代码束缚自己,并可能让它像没有腿的狗一样执行。 Grep 已经出现了“一段时间”。它旨在搜索文本文件。如果您正在搜索文本并且 grep 可以满足您的所有需求,那么它是一个很好的选择。

标签: python


【解决方案1】:

使用grep:

$ grep -C 3 benz mytext.txt

【讨论】:

  • 我想要在 python 中使用它!
  • 为什么要重新发明轮子?
  • 如何在 python 中实现它?因为它将成为我代码的一部分!请帮助
  • 除了-A 3-B 3 选项之外,您还可以将两者与-C 3 结合使用
【解决方案2】:

我写了一个可能对你有用的小函数:

from collections import deque

def search_cont(filename, search_for, num_before, num_after):
    with open(filename) as f:
        before_lines = deque(maxlen=num_before)
        after_lines = deque(maxlen=num_after+1)
        for _ in range(num_after+1):
            after_lines.append(next(f))
        while len(after_lines)>0:
            current_line = after_lines.popleft()
            if search_for in current_line:
                print("".join(before_lines))
                print(current_line)
                print("".join(after_lines))
                print("-----------------------")
            before_lines.append(current_line)
            try:
                after_lines.append(next(f))
            except StopIteration:
                pass

对于您的示例,您可以这样称呼它

search_for = raw_input('enter the word:')
search_cont('mytext.txt', search_for, 3, 3)

此解决方案对文件大小没有上限(除非您的行很长),因为内存中的行数永远不会超过 7 行。

【讨论】:

    【解决方案3】:

    你可以从 python 调用grep

    import subprocess
    result = subprocess.check_output(["grep" "-A" "3" "-B" "3" "benz" "mytext.txt"])
    

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多