Python 从文件中读取两个连续的行并打印出来

Python 从文件中读取两个连续的行并打印出来,python,python-3.x,Python,Python 3.x,我有一个文本文件,我只想得到相互关联的行。尝试使用next()函数执行此操作,但没有成功,它将抛出StopIteration。我不知道如何才能做到这一点,如果有人能为我指出正确的方向,我将不胜感激 以下资料: the expected output should look like this: address-family ipv4 vrf vrf2 neighbor 10.244.120.202 route-map LOCAL_PREF in address-family ipv4 v

我有一个文本文件,我只想得到相互关联的行。尝试使用
next()
函数执行此操作,但没有成功,它将抛出
StopIteration
。我不知道如何才能做到这一点,如果有人能为我指出正确的方向,我将不胜感激

以下资料:

the expected output should look like this:

address-family ipv4 vrf vrf2 
 neighbor 10.244.120.202 route-map LOCAL_PREF in 
address-family ipv4 vrf vrf3
 neighbor 10.249.34.129 route-map LOCAL_PREF in
address-family ipv4 vrf vrf6
 neighbor 10.242.120.202 route-map LOCAL_PREF in 
address-family ipv4 vrf vrf9
 neighbor 10.246.88.2 route-map LOCAL_PREF in
 
>>>> text File <<<< 
address-family ipv4 vrf vrf1
address-family ipv4 vrf vrf2 
 neighbor 10.244.120.202 route-map LOCAL_PREF in 
address-family ipv4 vrf vrf3
 neighbor 10.249.34.129 route-map LOCAL_PREF in
address-family ipv4 vrf vrf5
address-family ipv4 vrf vrf6
 neighbor 10.242.120.202 route-map LOCAL_PREF in 
address-family ipv4 vrf vrf7
address-family ipv4 vrf vrf8
address-family ipv4 vrf vrf9
 neighbor 10.246.88.2 route-map LOCAL_PREF in

>>> code <<<<

with open('out_put.txt', 'r') as f:
    for line in f.readlines():
        if line.startswith('address-family'):
            first_line = line.strip()  # strip() removes whitespace surrounding the line
            print(first_line)
            second_line = next(f).strip()
            print(second_line)
预期输出应如下所示:
地址系列ipv4 vrf vrf2
邻居10.244.120.202路线图本地优先
地址系列ipv4 vrf vrf3
邻居10.249.34.129路线图本地优先
地址系列ipv4 vrf vrf6
邻居10.242.120.202路线图本地\u PREF in
地址系列ipv4 vrf vrf9
邻居10.246.88.2路线图本地优先

>>>>文本文件代码我建议使用.splitlines()函数和索引。如果可以将文件的行转换为列表,则可以使用loop If语句获取所需的标记,然后找到该标记+1并读取该行(以获得下一个连续行)


注意--如果您使用的是标准文本文件,最好将encoding='utf-8添加为open()函数的第三个参数。这将消除烦人的\n字符,让计算机更熟悉它实际读取的内容。

下一个函数使用迭代器,在这种情况下,文件句柄已经通过readlines()函数读取了所有文件内容,没有其他内容可读取

您可以使用如下使用索引来引用下一个连续行

with open('out_put.txt', 'r') as f:
    lines = f.readlines()
    for i, line in enumerate(lines):
        if line.startswith('address-family'):
            first_line = line.strip()
            print(first_line)
            second_line = lines[i+1].strip()
            print(second_line)

此代码确保文件符合预期格式,即不以“address family”开头的每一行前面都必须有一个以“address family”开头的行,并且以“address family”开头的行后面最后必须有一个不以“address family”开头的行

previous_line = None
with open('out_put.txt', 'r') as f:
    for line in f:
        if line.startswith('address-family'):
            previous_line = line
        else:
            if not previous_line:
                raise Exception('Unexpected file format')
            print(previous_line, end='')
            print(line, end='')
            previous_line = None
if previous_line is not None:
    raise Exception('Unexpected file format')
印刷品:

address-family ipv4 vrf vrf2
 neighbor 10.244.120.202 route-map LOCAL_PREF in
address-family ipv4 vrf vrf3
 neighbor 10.249.34.129 route-map LOCAL_PREF in
address-family ipv4 vrf vrf6
 neighbor 10.242.120.202 route-map LOCAL_PREF in
address-family ipv4 vrf vrf9
 neighbor 10.246.88.2 route-map LOCAL_PREF in
请尝试下面的代码

以open(“out\u put.txt”,“r”)作为f:
line=f.readline()
while(行):
如果line.strip().startswith(“地址族”):
line2=f.readline()
如果line2和line2.strip().StartWith(“邻居”):
打印(行,结束=“”)
打印(第2行,结束=“”)
行=行2
其他:
line=f.readline()

请删除与实际问题无关的所有代码(即,除最后七行外的所有代码)。“尝试使用next执行此操作,但未成功”->您能否澄清它是如何失败的?已删除额外代码<代码>第二行=下一步(f).Studio()/<代码>这是我使用的,但是我得到了<代码>停止迭代< /代码>。您应该考虑OP的文本文件作为示例输入。所以:1。如果文本文件有4行连续的“address family…”怎么办然后是“邻居”。你的代码还能用吗?2.您编写的代码是否实际打印出OP想要的内容(提示:您正在调用
strip()
)?是的,我使用OP的文本文件测试代码。1.是的,很有效2.我明白。我现在就换。谢谢。但是现在,如果不调用
strip()
,您的输出就会有一个额外的换行符。所以使用
打印(行,结束=“”)
。谢谢。我已经改变了它。你应该考虑OP的文本文件作为一个例子输入。所以:1。如果文本文件有4行连续的“address family…”怎么办然后是“邻居”。你的代码还能用吗?2.你的代码实际上打印出OP想要什么(提示:你正在调用<代码>条()/代码>)?你应该考虑OP的文本文件作为一个示例输入。如果输入文件有4行连续的“地址族…”怎么办然后是“邻居”。您的算法仍然有效吗?如果文件的最后一行以“address family”开头,您的代码将异常终止。你应该考虑每一种可能的情况。@李菊,这正是它要做的。将my into读入:“…‘address family’后面必须紧跟一行,而不是以‘address family’开头。”因此,如果输入以‘address family’结尾,则应抛出异常。我的假设(对或错)是“地址家庭”必须与“邻居”匹配。OP会知道这是否是一个有效的假设,并且可以删除最后的检查。@Booboo非常感谢,它起作用了