Python 解析一个巨大的文本文件并在匹配后获得下一行和上一行

Python 解析一个巨大的文本文件并在匹配后获得下一行和上一行,python,Python,我有一个大约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)

我有一个大约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)
但我未定义的错误使用:

使用:

使用:

使用:


我编写了一个可能对您的案例有用的小函数:

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行。

我编写了一个可能对您的情况有用的小函数:

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行。

我编写了一个可能对您的情况有用的小函数:

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行。

我编写了一个可能对您的情况有用的小函数:

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行。

您可以从python调用
grep

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

您可以从python调用
grep

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

您可以从python调用
grep

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

您可以从python调用
grep

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


我想要python版本的!为什么要重新发明轮子?我如何用python实现它?因为它将成为我代码的一部分!请提供帮助,而不是同时使用
-a3
-b3
选项。您可以将这两个选项与
-c3
结合使用,我希望在python中使用它!为什么要重新发明轮子?我如何用python实现它?因为它将成为我代码的一部分!请提供帮助,而不是同时使用
-a3
-b3
选项。您可以将这两个选项与
-c3
结合使用,我希望在python中使用它!为什么要重新发明轮子?我如何用python实现它?因为它将成为我代码的一部分!请提供帮助,而不是同时使用
-a3
-b3
选项。您可以将这两个选项与
-c3
结合使用,我希望在python中使用它!为什么要重新发明轮子?我如何用python实现它?因为它将成为我代码的一部分!请帮助代替@Lutz Horn建议的
-a3
-b3
选项,您可以将两者结合使用
-c3
,grep是一个不错的选择。你自己做,你会用不必要的代码束缚自己,很可能让它像一只没有腿的狗一样运行。格雷普已经有一段时间了。它是用来搜索文本文件的。如果你正在搜索文本,而grep做了你所需要的一切,这是一个很好的选择。正如@Lutz Horn所建议的,grep是一个很好的选择。你自己做,你会用不必要的代码束缚自己,很可能让它像一只没有腿的狗一样运行。格雷普已经有一段时间了。它是用来搜索文本文件的。如果你正在搜索文本,而grep做了你所需要的一切,这是一个很好的选择。正如@Lutz Horn所建议的,grep是一个很好的选择。你自己做,你会用不必要的代码束缚自己,很可能让它像一只没有腿的狗一样运行。格雷普已经有一段时间了。它是用来搜索文本文件的。如果你正在搜索文本,而grep做了你所需要的一切,这是一个很好的选择。正如@Lutz Horn所建议的,grep是一个很好的选择。你自己做,你会用不必要的代码束缚自己,很可能让它像一只没有腿的狗一样运行。格雷普已经有一段时间了。它是用来搜索文本文件的。如果您正在搜索文本,而grep做了所有您需要的事情,那么它是一个很好的选择。