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

时间:2017-09-04 14:44:52

标签: python loops

我无法从文件中读取并指定一些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>

我可以浏览菜单和子菜单,然后返回主菜单直到第6行。之后我正在努力做什么。问题出在第7行,当用户选择xDSL类型时,他应该跳转到菜单xDSL interface(第12行),然后当他完成所有子菜单{{ 1}}他应该返回到第10行并选择xDSL Interface类型,然后向前跳到第25行并选择Ethernet然后再次使用{{1}的所有子菜单他应该回到第11行,然后选择Ethernet Interface并做之前的事情。

所以这就是我想要做的。我正在读取TSV文件中的行,在读完一行并找到一个特定的字符串,例如:Ethernet Interface后,我可以在此循环中启动一个嵌套循环来检查以下行并转到{{1像这样:

SHDSL

这里,在第7行找到xDSL,然后在第12行找到xDSL Interface时打破for循环,转到下一个if第12行的函数。但是当它断开并启动下一个if函数时它将从第8行恢复,它不会计算我在前一个if条件中嵌套循环中所做的行条。

另外我的下一个问题是,当我完成if list_title == "Interface": for inner_record in testData.dataset(findFile("testdata","parsedXML.tsv")): inner_label = testData.field(inner_record,"Label") test.log("Running inner loop.") if inner_label == "xDSL Interface": break else: inner_label.strip() if (here is the next if-loop that will work from the line where xDSL Interface was found) 的所有子菜单直到第23行时,我想跳回第10行到Interface并找到此行,我想跳到第25行继续xDSL Interface,就像之前一样。

我正在通过以下方式保留代码正在读取的文件行的计数:

xDSL Interface

我可以构建一个行开始位置列表(文件偏移),然后使用Ethernet返回第n行(从零开始计数)。但问题是我必须将此Ethernet Interface保留在if循环中,然后继续使用此循环之外的另一个if循环。但是我在那里遇到类似的问题,当我跳过线路或者想要返回时,在嵌套循环中它可以工作,但是如何从外部if循环继续?

我的目标:

我想制作一些嵌套的if循环,当文件读取for lineno, line in enumerate(f, start=1): 类型时,IF语句将搜索包含xDSL接口的行(第12行),然后继续读取直到所有子xDSL接口的菜单,然后if语句将返回到第10行,当它找到字符串file.seek(line_offsets[n])时,它将搜索以太网接口并转到第25行并再次读取所有读取功能在以太网接口的子菜单中,他应该返回到第11行并搜索SHDSL并像以前一样。

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

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

0 个答案:

没有答案
相关问题