将值添加到嵌套字典(python)时出错

时间:2015-10-04 00:31:19

标签: python dictionary elementtree

我一直在研究解析一些XML数据并将特定值放入嵌套字典中。在查看数据并研究如何最好地解析数据之后,我已经确定XPath解析比子对象解析更合适,因为它没有正确地用于子解析。

所以我希望将这些数据移动到嵌套字典中以便稍后输出。我第一次尝试添加一个值似乎已经有效但是当它遇到第一个内部项时我得到一个错误。我认为我正确理解错误,我知道字符串在python中是不可变的,但我不明白为什么它在第一个键上工作而在第二个键上失败。任何人都可以解释或指向某个地方吗?

我得到的错误如下:TypeError: 'str' object does not support item assignment这位于以下行dictionary['host']['port'] = port。如上所述,这种方法似乎适用于这一行dictionary['host'] = host我还想指出,我并非100%确定这种方法是可行的,我目前正在实现实现目标的想法。

from xml.etree import ElementTree

data_file = 'data.xml'

dictionary = {}
dictionary['host'] = {}
dictionary['host']['port'] = {}
dictionary['host']['port']['service'] = {}


with open(data_file, 'rt') as f:
    tree = ElementTree.parse(f)

for node in tree.findall('.//address'):
    if (node.attrib.get('addrtype') == 'ipv4'):
        host = node.attrib.get('addr')
        dictionary['host'] = host
        for node in tree.findall('.//port'):
            port = node.attrib.get('portid')
            dictionary['host']['port'] = port
            for node in tree.findall('.//service'):
                product = node.attrib.get('product')
                dictionary['host']['port']['service'] = product

1 个答案:

答案 0 :(得分:1)

问题

dictionary['host']['port'] = port本身没有任何问题,但问题出现了,因为您在相关行之前更改了dictionary['host']的值。

host = node.attrib.get ('addr')
dictionary['host'] = host # <- here
  

注意:在此之后,dictionary['host']不再引用(嵌套) dict ,因为密钥已经过用 str 类型的对象覆盖。 str 类型的对象是node.attrib.get('addr')的间接结果。

下面的测试用例很容易重现这个问题:

>>> x = {}
>>> x['host'] = "some string"
>>> x['host']['port'] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment