Python读取文件将一直向前跳,直到找到特定的字符串并从前面的lin中重新读取

2024-09-30 01:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{2}$

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

所以这就是我想做的。我正在从TSV文件中读取行,在我读取一行并找到一个特定的字符串之后,例如:xDSL,我可以在这个循环中启动一个嵌套循环来检查以下行并转到xDSL Interface,如下所示:

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)

在这里,Interface在第7行中找到,然后当xDSL Interface出现在第12行时,我中断for循环,转到下一个从第12行开始工作的if函数。但当它中断并启动下一个if函数时,它从第8行恢复,它不计算我在上一个if条件下在嵌套循环中所做的行strip。在

另外,我的下一个问题是,当我完成了所有的子菜单xDSL Interface直到第23行,我想跳回到第10行到Ethernet并且当找到这一行时,我想向前跳到第25行,然后像以前一样继续Ethernet Interface。在

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

for lineno, line in enumerate(f, start=1):

我可以构建一个行开始位置(文件偏移量)的列表,然后使用file.seek(line_offsets[n])返回第n行(从零开始计数)。但问题是我必须将这个file.seek保存在一个if循环中,然后继续使用这个循环之外的另一个if循环。但我也面临类似的问题,当我跳过一行或想返回时,在嵌套循环中它是有效的,但如何从外部if循环继续呢?在

我的目标:

我想做一些嵌套的if循环,当文件读取xDSLtype时,if语句将搜索到包含xDSL interface的行(第12行),然后一直读到xDSL interface的所有子菜单,然后if语句将返回到第10行,当它找到字符串Ethernet时,它将搜索以太网接口并转到第25行,然后当read函数遍历了以太网接口的所有子菜单时,他应该返回到第11行,搜索SHDSL,然后像之前那样做。在

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

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


Tags: 文件iftsvmodetype菜单xmlprofile

热门问题