Python:使用反向循环从文本文件中查找部分

时间:2018-12-04 21:22:22

标签: python for-loop text filter package

在python中,我有一个输入文本文件(如下),其中包括3个文本部分,我需要首先在每个文本部分的底部找到所有包括'shsux / en',然后在本节下,我想循环查找以'udp'和'jkp'开头的所有行,并将整个部分输出到一个新的文本文件中。

hsussksdjeoslllllllllllll/shsux/ujkes
        jkp_shsu_hhhhhhhhhhhhhhhhhhhhhhhhh
        jkp_shsu_hhhhhhhhhsesssssssssssssssss
        jkp_shsu_hhhhhhhhhsesssssssssssssssss
hsussksdjeoslllllllllllll/shsux/en
------------------------------------------------------------
hsussksdjeoslllllllllllll/shsux/sed
        udp_shsu_hhhhhhhhhhhhhhhhhhhhhhhhh
        udp_shsu_hhhhhhhhhsesssssssssssssssss
        jkp_shsu_hhhhhhhhhsesssssssssssssssss
hsussksdjeoslllllllllllll/shsux/en
------------------------------------------------------------
hsussksdjeoslllllllllllll/dfsux/df
        udp_shsu_hhhhhhhhhhhhhhhhhhhhhhhhh
        udp_shsu_hhhhhhhhhsesssssssssssssssss
        jkp_shsu_hhhhhhhhhsesssssssssssssssss
hsussksdjeoslllllllllllll/dfsux/en
------------------------------------------------------------

例如,带有'/ shsux / en'的第一行是

hsussksdjeoslllllllllllll/shsux/en

我需要先找到它,一旦有了它,我想知道如何才能回退该节

        jkp_shsu_hhhhhhhhhhhhhhhhhhhhhhhhh
        jkp_shsu_hhhhhhhhhsesssssssssssssssss
        jkp_shsu_hhhhhhhhhsesssssssssssssssss

并以'jkp'返回行

关于应该使用的功能以及如何实现此功能的任何建议。谢谢!

1 个答案:

答案 0 :(得分:0)

请注意,如果您不能指定段的方式(并且在一个文件中有多个不同的段),则不可能列出段中符合某些条件的所有行。 但是,假设您只知道段的结尾,则可以在输入文件上循环两次。在第一次迭代中,您可以存储行数,在其中找到“节末”字符串。像这样:

end_of_section_line_nb = []

for counter, line in enumerate(file):
    if #condition to check, use regex or just "some_string in line", depending on your needs
    end_of_section_line_nb.append(counter)

然后再次循环遍历文件,并在任何块中搜索每次出现的字符串(“ udp” ...)。第一次迭代后,您知道节的结尾处有多少行,因此您可以检查您所在的节。

通过这种方式,您将“ udp”内容分配给下一个可识别的下一个块,但您将无法确定它是否在其中(因为您未指定块的开始方式)。

您还可以循环遍历文件,并始终将一些前几行存储在内存中,但是如果您的节很大,则效率不高。