我正在尝试在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
答案 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)