Python Dict:在已经创建的键中添加值而不会丢失原始值

时间:2012-08-30 18:42:39

标签: python xml dictionary

我正在尝试在dict中添加xml文件。现在我想要做的是将值更新到dict而不会丢失值。原因是我想将xml文件分组以显示标记作者所做的所有更改。

以下是xml文件的示例。

<log> 
<logentry 
revision="33185"> 
<author>glv</author> 
<date>2012-08-06T21:01:52.494219Z</date> 
<paths> 

<path 
kind="file" 
action="M">/branches/Patch_4_2_0_Branch/text.xml</path>    

<path 
kind="dir" 
action="M">/branches/Patch_4_2_0_Branch</path> 

</paths> 
<msg>PATCH_BRANCH:N/A 
BUG_NUMBER:N/A 
FEATURE_AFFECTED:N/A 
OVERVIEW:N/A 
Adding the SVN log size requirement to the branch  
</msg> 
</logentry> 
 .... 
</log> 

以下是我用Python编写的代码。

from xml.dom import minidom 
import smtplib 
from email.mime.text import MIMEText 
from datetime import datetime 

def xml_data (): 

f = open('C:\opidea_2.xml', 'r') 

data = f.read() 

f.close() 

dom = minidom.parseString(data) 

ic = (dom.getElementsByTagName('logentry')) 

dom = None       
content = '' 
author = {}   
for num in ic: 

authors = num.getElementsByTagName('author') 

if len(authors) > 0: 

  name = authors[0].firstChild.nodeValue 

  author.update({'author': str(name)})  

datef = [] 
xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue 
datef = [Good_Time] 
path_change = []  
paths = [x for x in num.getElementsByTagName("paths")[0].childNodes if isinstance(x, minidom.Element)] 

for path in paths:  

  x = path.childNodes[0].nodeValue   

if str(path.getAttribute("kind")) == 'dir': 

  path_change ='Directory location: ' + [str(x)] 
else:  
  path_change ='Filename: ' + [str(x)] 

xmlMsgf = [] 
xmlMsg = num.getElementsByTagName('msg') 


if xmlMsg !='' and len(xmlMsg) > 0: 
  xmlMsgc = xmlMsg[0].firstChild.nodeValue 
  xmlMsgf = [xmlMsgc] 


 else: 
   xmlMsgc = "No comment made." 
   xmlMsgf = [xmlMsgc] 

 authorentry.push{('author',authorA),('date',datef),('path',path_change),('path',xmlMsgf))}           

    for k, v in [(authorentry)]:

        try:

            author[k].append(v)

        except KeyError:

            author[k] = [v]

 author.update({'Date':datef,'Path':path_change,'msg':str(xmlMsgf)}) 
 print author

if __name__ == "__main__": 
  xml_data () 

现在我希望最终结果是这样的

Key 1 = glv,date1,path 1a path 1b,msg1,date2,path 2,msg 2,...

key 2 = jsm,date1,path 1,msg 1。

我想将author.update({'Date':datef,'Path':path_change,'msg':str(xmlMsgf)})分组以列出作者的xml文件以附加下一组内容作者提出的。不太确定如何去做。任何帮助,将不胜感激。这是我更新的代码,但我现在似乎得到了无效的语法错误:

  line 151
    authorentry.push{('author',authorA),('date',datef),('path',path_change),('path',xmlMsgf))}           
                    ^
 SyntaxError: invalid syntax

1 个答案:

答案 0 :(得分:6)

你不能保持旧的价值观。在dict中,每个键只有一个与之关联的值。

您可以在dict中使用聚合值类型,例如,您可以使用列表作为值,每次找到要添加的数据时,都会将其附加到关联列表中。

data = {}

for k, v in [('a', 1), ('a', 2), ('b', 3)]:
    try:
        data[k].append(v)
    except KeyError:
        data[k] = [v]  # a list of one element!

collections模块中的便利构造函数可以使这更容易:

import collections

data = collections.defaultdict(list)
for k, v in [('a', 1), ('a', 2), ('b', 3)]:
    data[k].append(v)