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

时间:2017-08-28 10:12:02

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

2 个答案:

答案 0 :(得分:0)

让我看看我是否正确理解了这一点:你只想在一组“价值观”之后执行一个印刷语句。被解析。这是我的看法:

private func makeLoginRestCall(email:String, password:String){
guard let url = URL(string: "http://-----------/PassengerLogin.php") else {
        return
    }
    var request = URLRequest(url:url)
    request.httpMethod = "POST"
    let emailString : String = "email="
    let parameters = emailString + email+",password=" + password
    request.httpBody = parameters.data(using: .utf8)
    let session = URLSession.shared
    session.dataTask(with:request) {
        (data,response,error) in
        if let response = response {
            print(response)
        }else{
            print("No response")
        }
        if let data = data {
            do{
                let json  = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary
                print(json ?? "No data found")
            }catch{
                print(error)
            }
        }else {
            print("No data found")
        }
    }.resume()}

产生:

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,因为您需要保留广告订单。

答案 1 :(得分:-1)

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

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