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