Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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读取特定行,在该关键字之后仅读取5行_Python - Fatal编程技术网

Python读取特定行,在该关键字之后仅读取5行

Python读取特定行,在该关键字之后仅读取5行,python,Python,我想使用python从文本文件中提取特定的行。我想从邻居开始提取行,然后提取5行。这是一种逐行读取文件的方法,如果文件很大,这可能比一次读取整个文件更有效 count=0 关键字_found=False 打开(“file.txt”)作为文件: 下一行=真 下一行: 下一行=file.readline() 如果下一行从(“邻居”)开始: 关键字_found=True 如果找到关键字_: 计数+=1 如果下一行和计数>5: 打印(下一行) 编辑: 要在找到关键字时返回number\u lines\

我想使用python从文本文件中提取特定的行。我想从邻居开始提取行,然后提取5行。

这是一种逐行读取文件的方法,如果文件很大,这可能比一次读取整个文件更有效

count=0
关键字_found=False
打开(“file.txt”)作为文件:
下一行=真
下一行:
下一行=file.readline()
如果下一行从(“邻居”)开始:
关键字_found=True
如果找到关键字_:
计数+=1
如果下一行和计数>5:
打印(下一行)
编辑: 要在找到关键字时返回
number\u lines\u back
并打印
number\u lines\u total
行总数:

number\u line\u back=3
行数\u总数=7
关键字_found=False
前几行=[0]*后几行
打开(“file.txt”)作为文件:
下一行=真
下一行:
下一行=file.readline()
如果下一行从(“邻居”)开始:
关键字_found=True
对于上一行中的行:
打印(行)
打印行数=打印行数-打印行数
其他:
上一行。弹出(0)
上一行。追加(下一行)
如果找到关键字_:
行到打印-=1
如果下一行和要打印的行>=0:
打印(下一行)
其他:
打破

注意:
number\u lines\u back
不应太大,否则
prev\u lines
列表会变得太大。此外,这仅在文件中只有一行以单词“neighbor”开头时才起作用,因此,如果输出不符合预期,可能就是原因。

itertools
可以提供帮助
dropwhile
将删除行,直到满足条件,因此可以设置为在看到“邻居”时开始提取行
islice
将接受给定数量的项(类似于列表切片,但作为一个函数,因此可以与其他迭代器一起使用)。把它们放在一起

import itertools

def foo(filename):
    with open(filename) as fp:
        return list(itertools.islice(
            itertools.dropwhile(lambda l: not l.startswith("neighbor"), fp),
            0, 6))

# test
with open("mytestfile.txt", "w") as f:
    for i in range(6):
        f.write(f"this is pre line {i}\n")
    f.write("neighbor line here\n")
    for i in range(20):
        f.write(f"this is post line {i}\n")

mylist = foo("mytestfile.txt")
print("".join(mylist))
如果嵌套工具令人困惑,您可以将内部迭代器拉出到它自己的变量中

def foo(filename):
    with open(filename) as fp:
        dropper = itertools.dropwhile(
            lambda l: not l.startswith("neighbor"), fp)
        return list(itertools.islice(dropper, 0, 6))

您能否在问题中添加示例输入/预期输出+到目前为止您做了什么?如果line.startswith('neighbor'):,则不应该是
?要求您输入预期输入和输出的代码。这有助于我们理解问题,并为撰写答案奠定基础。在我下面建议的答案中,我发布了一个完整的功能程序。无论你是喜欢答案还是接受答案,它都展示了应该被质疑的东西。
将open('file.txt','r')作为f:
对于i,在枚举(f)中的行:
如果line.startswith('neighboror'):
lst=[lst[n]对于范围(i,5+1)中的n
break
@MarsNebulaSoup你是对的。布拉姆·德克尔:你做到了。有一个轻微的打字错误,而不是线,这是线_下一个,但它确实为我工作。非常感谢。如果我想改变一下,你能推荐一个学习Python的资源吗。假设如果我找到关键词,我想返回三行,然后阅读接下来的7行???@NyleIc哦,是的,你说得对。我编辑了这篇文章。对于basic来说,像这样的书可能会有所帮助。有关特定算法或特定函数的信息,这些都是不错的网站。当然,如果遇到任何问题,Stackoverflow!祝你学习Python好运@这个程序找到“邻居”,跳过5行,然后打印文件的其余部分。如果你想往回走3行,然后跳过7行,然后打印,这难道不等于只跳过前面的4行吗?@Bram Dekker我想做的是找到邻居,然后往回走3行。一旦我回到三行,我想开始阅读,数到7行。所以find关键字返回从该点读取的三行,直到行数为7