从变量创建列表列表,并在每个For-Python循环之后打印最终列表

从变量创建列表列表,并在每个For-Python循环之后打印最终列表,python,list,Python,List,我有一个如下所示的日志文件: |Label: - Name:locale - Type: |Label:Main Menu - Name:menu - Type: ||Label:Broadband - Name:menu - Type: |||Label:Load and Save Profiles - Name:menu - Type: ||||Label:Load Profile - Name:application - Type: ||||Label:Save Profile - Nam

我有一个如下所示的日志文件:

|Label: - Name:locale - Type:
|Label:Main Menu - Name:menu - Type:
||Label:Broadband - Name:menu - Type:
|||Label:Load and Save Profiles - Name:menu - Type:
||||Label:Load Profile - Name:application - Type:
||||Label:Save Profile - Name:application - Type:
||||Label:Delete Profile - Name:application - Type:
|||Label:Interface - Name:parameter - Type:list
||||Label:xDSL - Name:value - Type:
||||Label:SFP - Name:value - Type:
||||Label:Ethernet - Name:value - Type:
||||Label:SHDSL - Name:value - Type:
|||Label:xDSL Interface - Name:menu - Type:
||||Label:xDSL Mode - Name:parameter - Type:list
|||||Label:Annex A/M - Name:value - Type:
|||||Label:Annex B/J - Name:value - Type:
||||Label:MAC Address - Name:application - Type:
|||||Label:MAC Address - Name:param - Type:string
||||Label:Vectoring Mode - Name:parameter - Type:list
|||||Label:Disabled - Name:value - Type:
|||||Label:Enabled - Name:value - Type:
|||||Label:Friendly - Name:value - Type:
||||Label:G.FAST - Name:parameter - Type:list
|||||Label:Disabled - Name:value - Type:
|||||Label:Enabled - Name:value - Type:
||||Label:Auto Re-Sync - Name:parameter - Type:list
|||||Label:On - Name:value - Type:
|||||Label:Off - Name:value - Type:
dict = {}

with open("/home/mr/Desktop/git/Squish/parsedXML.txt") as f:

    for line in f:
        if "list" in line:                
            list_title = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title] = []

        if "value" in line:
            list_option = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title].append(list_option)
        test.log(str(dict)) #The print command for the IDE I am using
我想编写一个python代码,读取txt文件,创建列表列表,并在每个for循环之后打印列表文件

这是我写的代码:

dict = {}

with open("/home/mr/Desktop/git/Squish/parsedXML.txt") as f:

    for line in f:
        if "list" in line:                
            list_title = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title] = []

        if "value" in line:
            list_option = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title].append(list_option)
            test.log(str(dict)) #The print command for the IDE I am using
代码的输出为:

TestCase tst_xml_tree_2 Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_G.FAST': ['Disabled']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_G.FAST': ['Disabled', 'Enabled']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_Auto Re-Sync': ['On'], 'lst_G.FAST': ['Disabled', 'Enabled']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_Auto Re-Sync': ['On', 'Off'], 'lst_G.FAST': ['Disabled', 'Enabled']} Aug 28, 2017 11:57:37 AM
但如果您查看输出,它每次在列表中添加字符串时都会打印。我想在每次for循环后打印列表的最终输出。像这样:

Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL']} Aug 28, 2017 11:57:37
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 11:57:37 AM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_Auto Re-Sync': ['On', 'Off'], 'lst_G.FAST': ['Disabled', 'Enabled']} Aug 28, 2017 11:57:37 AM
谁能告诉我我该如何做到这一点

如果我将print命令放在循环之外,如下所示:

|Label: - Name:locale - Type:
|Label:Main Menu - Name:menu - Type:
||Label:Broadband - Name:menu - Type:
|||Label:Load and Save Profiles - Name:menu - Type:
||||Label:Load Profile - Name:application - Type:
||||Label:Save Profile - Name:application - Type:
||||Label:Delete Profile - Name:application - Type:
|||Label:Interface - Name:parameter - Type:list
||||Label:xDSL - Name:value - Type:
||||Label:SFP - Name:value - Type:
||||Label:Ethernet - Name:value - Type:
||||Label:SHDSL - Name:value - Type:
|||Label:xDSL Interface - Name:menu - Type:
||||Label:xDSL Mode - Name:parameter - Type:list
|||||Label:Annex A/M - Name:value - Type:
|||||Label:Annex B/J - Name:value - Type:
||||Label:MAC Address - Name:application - Type:
|||||Label:MAC Address - Name:param - Type:string
||||Label:Vectoring Mode - Name:parameter - Type:list
|||||Label:Disabled - Name:value - Type:
|||||Label:Enabled - Name:value - Type:
|||||Label:Friendly - Name:value - Type:
||||Label:G.FAST - Name:parameter - Type:list
|||||Label:Disabled - Name:value - Type:
|||||Label:Enabled - Name:value - Type:
||||Label:Auto Re-Sync - Name:parameter - Type:list
|||||Label:On - Name:value - Type:
|||||Label:Off - Name:value - Type:
dict = {}

with open("/home/mr/Desktop/git/Squish/parsedXML.txt") as f:

    for line in f:
        if "list" in line:                
            list_title = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title] = []

        if "value" in line:
            list_option = re.search('Label:(.*) - N', line).group(1)
            dict['lst_%s' % list_title].append(list_option)
        test.log(str(dict)) #The print command for the IDE I am using
它打印以下输出:

TestCase tst_asd Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': []} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': []} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': [], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J']} Aug 28, 2017 12:26:06 PM
Log {'lst_Interface': ['xDSL', 'SFP', 'Ethernet', 'SHDSL'], 'lst_Vectoring Mode': ['Disabled', 'Enabled', 'Friendly'], 'lst_xDSL Mode': ['Annex A/M', 'Annex B/J'], 'lst_G.FAST': []} Aug 28, 2017 12:26:06 PM
另一个问题是,当在该列表中创建新列表时,在我的代码中,应按以下顺序创建该列表:

'lst_Interface' > 'lst_xDSL Mode' > 'lst_Vectoring Mode' >  'lst_G.FAST' > 'lst_Auto Re-Sync'
但是,如果您查看日志的最后一行,您将看到列表顺序是:

'lst_Interface' > 'lst_Vectoring Mode' > 'lst_xDSL Mode' > 'lst_Auto Re-Sync' > 'lst_G.FAST' 
如何维护列表的顺序

进一步澄清问题:


实际上,我正在浏览一个应用程序的XML文件,每次在XML上找到字符串“list”时,我都要创建一个新的列表,然后立即创建一组“值”,我要将其附加到该列表中,然后打印最终的列表。完成后,它将继续查找文件,当它在XML文件中找到另一个“列表”字符串时,它将创建另一个列表,依此类推。没有办法做到这一点吗?

每个列表结束后都无法打印,因为您的输入没有排序,因此无法知道特定列表是否结束


您所能做的就是在处理完整个文件后打印列表;为此,请将您的print语句放在循环之外。

让我看看我是否正确理解了这一点:您希望仅在解析一组“值”后执行print语句。以下是我的看法:

import re
from collections import OrderedDict

history = OrderedDict()

with open("file.txt") as f:
    flag = False
    for line in f:
        if "value" in line:
            list_option = re.search('Label:(.*) - N', line).group(1)
            history['lst_%s' % list_title].append(list_option)
            flag = True
        elif flag:  # executes only if previous line was a 'value' and this one is not.
            print(str(history))  # Replace this print statement with yours.
            flag = False
        if "list" in line:
            list_title = re.search('Label:(.*) - N', line).group(1)
            history.update({'lst_%s' % list_title: []})
    else:
        print(str(history))  # Replace this one as well.
产生:

OrderedDict([('lst_Interface', ['xDSL', 'SFP', 'Ethernet', 'SHDSL'])])
OrderedDict([('lst_Interface', ['xDSL', 'SFP', 'Ethernet', 'SHDSL']), ('lst_xDSL Mode', ['Annex A/M', 'Annex B/J'])])
OrderedDict([('lst_Interface', ['xDSL', 'SFP', 'Ethernet', 'SHDSL']), ('lst_xDSL Mode', ['Annex A/M', 'Annex B/J']), ('lst_Vectoring Mode', ['Disabled', 'Enabled', 'Friendly'])])
OrderedDict([('lst_Interface', ['xDSL', 'SFP', 'Ethernet', 'SHDSL']), ('lst_xDSL Mode', ['Annex A/M', 'Annex B/J']), ('lst_Vectoring Mode', ['Disabled', 'Enabled', 'Friendly']), ('lst_G.FAST', ['Disabled', 'Enabled'])])
OrderedDict([('lst_Interface', ['xDSL', 'SFP', 'Ethernet', 'SHDSL']), ('lst_xDSL Mode', ['Annex A/M', 'Annex B/J']), ('lst_Vectoring Mode', ['Disabled', 'Enabled', 'Friendly']), ('lst_G.FAST', ['Disabled', 'Enabled']), ('lst_Auto Re-Sync', ['On', 'Off'])])

我使用了,因为您需要保留插入顺序。

只是一个建议,命名
listoflist
a
dict
会让事情变得有点混乱。谢谢。实际上,一开始我想创建一个列表数组。然后在互联网上搜索如何做到这一点。这就是我想到的。我将在我的最终代码中更改它。请避免编辑您的问题以回答错误的答案,尽量保持问题的简洁明了,否则它会变得更难阅读。这几乎正是我想要的。谢谢。如果您查看结果的第三行和第四行,其中会额外打印一个“[]”。这在前两行中没有出现。我怎样才能避免这些呢?@Russo现在应该被修复了,我刚刚颠倒了两个
if
s.@Russo不用担心,谢谢你将其标记为已接受。顺便说一下,我看到您正在解析一个XML文件,所以我假设您发布的文本文件只是XML文件的表示,管道表示嵌套级别。看起来麻烦太多了如果是这样的话,你应该检查一下,这样你就可以直接解析XML文件了。我也认为我做事情的方式比它应该做的更复杂。一个简短的总结:我已经编写了一个测试脚本,它将遍历应用程序的所有菜单。为此,我已经使用ElementTree生成了文本文件,现在我尝试获取所有分支,因为有不同的方法访问菜单的不同分支,所以我尝试一次对一个分支进行分组。如果我没有具体的问题,我想这不是讨论的好地方。如果我面临更多问题,我将发布一个新问题。再次感谢。