Python读取文件-向前跳,直到找到特定字符串并从前一行重新读取

Python读取文件-向前跳,直到找到特定字符串并从前一行重新读取,python,loops,Python,Loops,我在读取文件和指定某些if/else条件时遇到问题。我会尽力解释我的目标和我面临的问题。我正在处理一个应用程序的XML文件,并已将XML解析为TSV。现在我已经阅读了TSV文件,我已经浏览了所有的菜单,当我完成子菜单时,我必须返回到主菜单,进入下一个菜单并继续这样做。以下是应用程序的树状图: 1 -> Main Menu 2 -> Broadband 3 -> Load and Save Profiles 4

我在读取文件和指定某些if/else条件时遇到问题。我会尽力解释我的目标和我面临的问题。我正在处理一个应用程序的XML文件,并已将XML解析为TSV。现在我已经阅读了TSV文件,我已经浏览了所有的菜单,当我完成子菜单时,我必须返回到主菜单,进入下一个菜单并继续这样做。以下是应用程序的树状图:

 1   -> Main Menu   
 2      -> Broadband    
 3          -> Load and Save Profiles   
 4              -> Load Profile 
 5              -> Save Profile 
 6              -> Delete Profile   
 7          -> Interface    
 8              -> xDSL 
 10             -> Ethernet 
 11             -> SHDSL    
 12         -> xDSL Interface   
 13             -> xDSL Mode    
 14             -> MAC Address  
 15             -> Vectoring Mode
 16             -> G.FAST   
 17             -> Auto Re-Sync 
 18             -> Seamless Rate Adaption   
 19             -> G.INP    
 20             -> Power Cut Back   
 21             -> ATM Type 
 22             -> Voip Interface ATM Type
 23             -> Iptv Interface ATM Type  
 24   
 25         -> Ethernet Interface   
 26             -> Autonegotiation  
 27             -> Speed    
 28             -> Duplex Mode  
 29         -> SHDSL Interface  
 30             -> SHDSL Service    
 31             -> Side 
 32             -> Line Mapping 
 33             -> Bonding  
 34             -> Line Parameter   
这是原始XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<ke3600-menu-file language="en" display="English" index="1">
  <version major="0" minor="1" patch="0"/>
  <locale name="en_EN" timezone="CET-1CEST,M3.5.0,M10.5.0/3"/>
  <menu name="main_menu" display="Main Menu">
    <menu name="broadband" display="Broadband" help="100_help_broadband">
      <onenter proc="activateGfast"/>
      <menu name="load_save_profiles" display="Load and Save Profiles" help="601_help_profiles">
        <application name="load_profiles" display="Load Profile"/>
        <application name="save_profiles" display="Save Profile"/>
        <application name="remove_profiles" display="Delete Profile"/>
      </menu>
      <parameter type="list" name="wanInterface" display="Interface" help="101_help_wanInterface">
        <value id="0" name="ifDSL" display="xDSL"/>
        <value id="1" name="ifSFP" display="SFP"/>
        <value id="2" name="ifETH" display="Ethernet"/>
        <!-- <value i d="3" name="ifWLAN" display="WLAN"/> -->
        <value id="4" name="ifSHDSL" display="SHDSL"/>
      </parameter>

      <menu name="xdslinterface" display="xDSL Interface" help="200_help_xDslInterface">
        <parameter type="list" name="annex" display="xDSL Mode" help="201_help_xdslModi">
          <value id="0" name="xdsl_line_annex_a" display="Annex A/M"/>
          <value id="1" name="xdsl_line_annex_b" display="Annex B/J"/>
        </parameter>
        <application name="xdsl_macAddr" display="MAC Address" caption="MAC Address">
          <param type="string" name="xdsl_mac_addr" display="MAC Address" length="25"/>
        </application>
        <parameter type="list" name="xdsl_vectoring_mode" display="Vectoring Mode" help="202_help_Vectoring">
          <value id="0" name="xdsl_vectoring_mode_disabled" display="Disabled"/>
          <value id="1" name="xdsl_vectoring_mode_enabled" display="Enabled"/>
          <value id="2" name="xdsl_vectoring_mode_friendly" display="Friendly"/>
        </parameter>
        <parameter type="list" name="xdsl_gfast_mode" display="G.FAST">
          <value id="0" name="xdsl_gfast_mode_disabled" display="Disabled"/>
          <value id="1" name="xdsl_gfast_mode_enabled" display="Enabled"/>
        </parameter>
        <parameter type="list" name="resync" display="Auto Re-Sync">
          <value id="1" name="re_sync_on" display="On"/>
          <value id="0" name="re_sync_off" display="Off"/>
        </parameter>
        <parameter type="list" name="seamlessRateAdaption" display="Seamless Rate Adaption">
          <value id="0" name="sra_off" display="Off"/>
          <value id="1" name="sra_on" display="On"/>
        </parameter>
        <parameter type="list" name="xdsl_ginp" display="G.INP">
          <value id="0" name="xdsl_ginp_none" display="Off"/>
          <value id="1" name="xdsl_ginp_down" display="Down"/>
          <value id="2" name="xdsl_ginp_up" display="Up"/>
          <value id="3" name="xdsl_ginp_both" display="Down/Up"/>
        </parameter>
        <parameter type="list" name="power_cut_back" display="Power Cut Back">
          <value id="0" name="power_cut_back_off" display="Off"/>
          <value id="1" name="power_cut_back_on" display="On"/>
        </parameter>
        <parameter type="list" name="atmType" display="ATM Type">
          <value id="0" name="atm_type_aal5" display="AAL5"/>
          <value id="1" name="atm_type_aal0pkt" display="AAL0PKT"/>
          <value id="2" name="atm_type_aal0cell" display="AAL0CELL"/>
        </parameter>
        <parameter type="list" name="voip_atmType" display="Voip Interface ATM Type">
          <value id="0" name="voip_atm_type_aal5" display="AAL5"/>
          <value id="1" name="voip_atm_type_aal0pkt" display="AAL0PKT"/>
          <value id="2" name="voip_atm_type_aal0cell" display="AAL0CELL"/>
        </parameter>
        <parameter type="list" name="iptv_atmType" display="Iptv Interface ATM Type">
          <value id="0" name="iptv_atm_type_aal5" display="AAL5"/>
          <value id="1" name="iptv_atm_type_aal0pkt" display="AAL0PKT"/>
          <value id="2" name="iptv_atm_type_aal0cell" display="AAL0CELL"/>
        </parameter>
      </menu>

      <menu name="ethernetinterface" display="Ethernet Interface" help="300_help_ethernetInterface">
        <parameter type="list" name="ethInterfaceAuto" display="Autonegotiation">
          <value id="1" name="ethInterfaceAutoOn" display="On"/>
          <value id="0" name="ethInterfaceAutoOff" display="Off"/>
        </parameter>
        <parameter type="list" name="ethInterfaceSpeed" display="Speed">
          <value id="2" name="ethIf1000" display="1000MBit/s"/>
          <value id="1" name="ethIf100" display="100MBit/s"/>
          <value id="0" name="ethIf10" display="10MBit/s"/>
        </parameter>
        <parameter type="list" name="ethInterfaceDuplexMode" display="Duplex Mode">
          <value id="1" name="ethIfFull" display="Full"/>
          <value id="0" name="ethIfHalf" display="Half"/>
        </parameter>
      </menu>
在这里,在第7行中找到了
接口
,然后在第12行找到
xDSL接口
时,我将中断for循环,以转到从第12行开始工作的下一个if函数。但是,当它中断并启动下一个if函数时,它从第8行恢复,它不计算我在前一个if条件中嵌套循环中所做的行带

另外,我的下一个问题是,当我完成从
xDSL接口
到第23行的所有子菜单时,我想跳回第10行到
Ethernet
,当找到这一行时,我想跳转到第25行,然后像以前一样继续
Ethernet接口

我通过以下方式记录代码此时正在读取的文件行数:

for lineno, line in enumerate(f, start=1):
我可以建立一个行起始位置(文件偏移量)列表,然后使用
file.seek(行偏移量[n])
返回第n行(从零开始计数)。但问题是我必须将这个
文件保持在if循环内,然后继续使用这个循环外的另一个if循环。但我也面临着类似的问题,当我跳过行或想返回时,在嵌套循环中它是有效的,但如何从外部if循环继续

我的目标:

我想做一些嵌套的if循环,当文件读取
xDSL
type时,if语句将搜索包含xDSL接口的行(第12行),然后继续读取,直到xDSL接口的所有子菜单,然后if语句将返回第10行,当它找到字符串
Ethernet
时,它将搜索Ethernet接口并返回第25行,然后当read函数遍历Ethernet接口的所有子菜单时,它将返回第11行并搜索SHDSL,并执行类似操作

如果有人想要简短的问题:


如何使用嵌套的if循环跳过python中的行,然后使用外部循环继续读取高级行?另外,如何使用嵌套的if循环返回python中的前一行,然后使用外部循环继续读取前一行?

如果有一个示例,说明您试图捕获的内容,会很有帮助。除非您希望处理数百MB的大文件,您最好将整个文件作为一个行列表来阅读(方便地说,如果您执行
list(f)
,python就会这样做),并将其作为一个列表来处理。@dawg,我已经更新了我的问题。如果您现在能理解,请告诉我。您是否考虑过通读该文件,并制作a)一个
接口列表
,以及b)每个接口类型的组件的单独列表?@spectras,我的日志文件大约有1000行,我的代码中已经有一个订购的信息。你认为将整个文件作为列表阅读是个好主意吗?我应该看看元组吗?举一个例子来说明您试图捕获的内容会很有帮助。除非您希望处理数百MB的大文件,否则最好将整个文件作为一个行列表来读取(方便地说,如果您执行
list(f)
,python就会这样做)并进行处理。@dawg,我已经更新了我的问题。如果您现在能理解,请告诉我。您是否考虑过通读该文件,并制作a)一个
接口列表
,以及b)每个接口类型的组件的单独列表?@spectras,我的日志文件大约有1000行,我的代码中已经有一个订购的信息。你认为将整个文件作为列表阅读是个好主意吗?我应该看看元组吗?
for lineno, line in enumerate(f, start=1):