Python中的多维字典
我有一个Python脚本,它可以解析一个XML文件,这个文件里包含了一些零件的信息,还有一个指令,告诉脚本应该如何处理这些信息。
<?xml version="1.0"?>
<servicexml>
<action>
<command>Add</command>
<partnumber>1223</partnumber>
<partname>Battery</partname>
<partdescription>Holds charge</partdescription>
</action>
<action>
<command>Add</command>
<partnumber>4444</partnumber>
<partname>Pump</partname>
<partdescription>Pumps stuff</partdescription>
</action>
</servicexml>
我正在尝试写一个Python脚本,目的是把所有相关的信息提取出来,并放到一个字典里,这样我就可以通过键来查找值。目前我的代码只能处理一维数据——这意味着在我的XML文件中,最后一个标签的值是唯一被写入的。那我该如何动态地为我的字典分配维度,以便能够存储来自XML文件的多个操作呢?这样我就可以访问每个零件序列的键值了。
这是我的Python代码
from lxml import etree
from StringIO import StringIO
actionInformation = []
tagsOfInterest = ['command','partnumber','partname','partdescrip']
tagDataOfIntrest = {}
xmlFile = "parts.xml"
context = etree.iterparse(xmlFile)
for action, elem in context:
if elem.tag in tagsOfInterest:
actionInformation.append([elem.tag,elem.text])
tagDataOfInterest = dict(actionInformation)
print tagDataOfInterest
根据David Alber的回答的解决方案
我需要更改一些导入的模块,不过他的办法我还是用了。
from lxml import etree
xmlFile = "parts.xml"
context = etree.parse(xmlFile)
actions = context.findall('action')
parsed = [{field.tag: field.text for field in action} for action in actions]
1 个回答
2
这里有一个可行的方法。它并没有把 partnumber
元素变成整数,不过看起来你本来也不是这样做的。其实如果需要的话,修改成整数也不难。
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse(xmlFile)
actions = tree.findall('action')
parsed = [{field.tag: field.text for field in action} for action in actions]
完整的自包含示例
这里有一个完整的示例,方便你进行验证。不同之处在于,上面提到的 xmlFile
被替换成了一个 StringIO
对象。
import StringIO
from xml.etree.ElementTree import ElementTree
s = """<?xml version="1.0"?>
<servicexml>
<action>
<command>Add</command>
<partnumber>1223</partnumber>
<partname>Battery</partname>
<partdescription>Holds charge</partdescription>
</action>
<action>
<command>Add</command>
<partnumber>4444</partnumber>
<partname>Pump</partname>
<partdescription>Pumps stuff</partdescription>
</action>
</servicexml>"""
st = StringIO.StringIO(s)
tree = ElementTree()
tree.parse(st)
actions = tree.findall('action')
parsed = [{field.tag: field.text for field in action} for action in actions]
运行完这个之后,你可以这样做:
>>> parsed
[{'command': 'Add',
'partdescription': 'Holds charge',
'partname': 'Battery',
'partnumber': '1223'},
{'command': 'Add',
'partdescription': 'Pumps stuff',
'partname': 'Pump',
'partnumber': '4444'}]