Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中循环文件时更改索引_Python_File_Loops - Fatal编程技术网

在python中循环文件时更改索引

在python中循环文件时更改索引,python,file,loops,Python,File,Loops,假设我必须阅读一个文件(相当大,大约20000行)。我必须在各行中循环查找关键字,例如STACKOVERFLOW。一旦找到关键字,我知道我将不得不处理接下来的10行 目前我做的是: with open(filepath) as f: for line_idx, line in enumerate(f): if re.match(my_keyword, line): # do something here from line_idx to line_

假设我必须阅读一个文件(相当大,大约20000行)。我必须在各行中循环查找关键字,例如
STACKOVERFLOW
。一旦找到关键字,我知道我将不得不处理接下来的10行

目前我做的是:

with open(filepath) as f:
    for line_idx, line in enumerate(f):
        if re.match(my_keyword, line):
            # do something here from line_idx to line_idx + 9
            # can i jump directly to line_idx + 10 ???
找到关键字后,是否有方法跳过接下来10行的过程(循环+搜索),并继续循环搜索,例如,行索引+10

谢谢大家!

更新
我想补充一点,我想要的是一种不必临时将文件保存到列表中的方法。使用此方法,我已经有了自己的解决方案。

您可以使用普通for循环,而不是for each循环:

with open(filepath) as f:
    lines = f.readlines()
    for i in range(len(lines)):
        if re.match(my_keyword, lines[i]):
            # do something
            i += 10
不过,它将比当前使用更多的内存,因为您正在将整个文件一次读入内存。要记住的东西

或者,如果将整个文件读入内存是一个问题,您可以将以下内容组合在一起:

with open(filepath) as f:
    skip = 0
    for line in f:
        if skip <= 0:
            if re.match(my_keyword, line):
                skip = 10
        else:
            skip -= 1
            print(line) # The next ten lines after a match can be processed here
打开(文件路径)作为f:
跳过=0
对于f中的行:

如果跳过//可能的解决方案是

f = open(filepath,"r")
lines = f.readlines()
count = -1
req_lines = []
for line in lines:
    count += 1
    if re.match(my_keyword, line):
        for i in range(10):
            count += 1
            req_lines.append(lines[count])

//现在,您需要的行位于名为“req_lines”的变量中,您可以对它们执行任何操作。

如果您有其他选择,您仍然需要将整个文件读入
列表,对吗?那么区别是什么呢?@scmg在第一种方法中,将整个文件读入变量
。在第二种方法中,您逐行迭代文件,因此在任何给定时间内存中只有一行。请参见,如果重新匹配(my_关键字,line[i])
,那么命令中的
行[i]
是什么?如果在一行中找到关键字,我应该如何处理接下来的10行?e、 g.打印它们out@scmg哦,你说得对。那是复制粘贴留下的。我编辑了我的答案。至于打印其他行,可以在
else
块中完成。您能提供一个示例吗?我不确定它是否在
else
块中工作。。。