Python中的多维字典

1 投票
1 回答
640 浏览
提问于 2025-04-17 13:05

我有一个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'}]

撰写回答