【问题标题】:Creating List of List from variable and Print the final list after each For Loop - Python从变量创建列表列表并在每个 For 循环后打印最终列表 - Python
【发布时间】:2018-02-05 14:00:06
【问题描述】:

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

|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:

我想编写一个 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

谁能告诉我我应该如何做到这一点?

如果我像这样将打印命令放在循环之外:

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 文件中找到另一个“列表”字符串时,它会创建另一个列表,依此类推。就没有办法实现吗?

【问题讨论】:

  • 只是一个建议,将listoflist 命名为dict 会让事情变得有点混乱。
  • 谢谢。实际上,起初我想创建一个列表数组。然后在互联网上搜索如何做到这一点。这就是我想出的。我将在我的最终代码中更改它。
  • 请避免编辑您的问题以回复错误的答案,尽量保持问题尽可能简洁明了,否则会变得难以阅读。

标签: python list


【解决方案1】:

让我看看我是否理解正确:您只想在解析一组“值”后执行打印语句。这是我的看法:

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'])])

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

【讨论】:

  • 这几乎正是我想要的。非常感谢。如果您查看结果的第三和第四行,其中会打印出一个额外的“[]”。前两行中没有出现。我怎样才能避免这些?
  • @Russo 现在应该修复了,我刚刚把两个 ifs 倒过来了。
  • @Russo 不用担心,感谢您将其标记为已接受。顺便说一句,我看到您正在解析 XML 文件,所以我假设您发布的文本文件只是 XML 文件的表示,管道指示嵌套级别。如果是这种情况,似乎比必要的麻烦更多,您应该检查ElementTree,以便您可以直接解析 XML 文件。
  • 是的,我正在解析一个 XML 文件。我也认为我做事的方式比它应该的更复杂。一个简短的总结:我编写了一个测试脚本,它将遍历应用程序的所有菜单。为此,我已经使用 ElementTree 生成了文本文件,现在我正在尝试获取所有分支,因为有不同的方法可以访问菜单的不同分支,因此我尝试一次将一个分支分组。如果我没有具体问题,我想这里不适合讨论。如果我遇到更多问题,我将发布一个新问题。再次感谢。
【解决方案2】:

由于您的输入未排序,因此无法在每个列表结束后打印,因此无法知道特定列表是否已结束。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多