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

2024-04-25 10:11:56 发布

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

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

|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

谁能告诉我我该怎么做?你知道吗

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

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文件中找到另一个“list”字符串时,它将创建另一个列表,以此类推。难道没有办法做到这一点吗?你知道吗


Tags: namelogmodetypelabelauginterfacelst
2条回答

让我看看我是否正确地理解了这一点:您只想在解析了一组“values”之后执行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'])])

我使用了^{},因为您需要保留插入顺序。你知道吗

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

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

相关问题 更多 >