首页 > 解决方案 > 从 XML 文件创建多个 Python 字典

问题描述

我有一个看起来像这样的 XML 文件:

<DATA>
    <DATA_VALUES>
        <SPEC>
            <Meta>1</Meta>
            <Data>100.430000</Data>
            <Intensity>2950.909708</Intensity>
            <Data>102.269997</Data>
            <Intensity>114341.550674</Intensity>
            <Data>103.260002</Data>
            <Intensity>47164.957890</Intensity>
            <Data>104.260002</Data>
            <Intensity>5102.098056</Intensity>
        </SPEC>
        <SPEC>
            <Peak>1</Peak>
            <Data>100.430000</Data>
            <Intensity>2950.909708</Intensity>
            <Data>102.269997</Data>
            <Intensity>114341.550674</Intensity>
            <Data>103.260002</Data>
            <Intensity>47164.957890</Intensity>
            <Data>104.260002</Data>
            <Intensity>5102.098056</Intensity>
        </SPEC>

实际上还有更多部分,我想为每个部分生成一个字典,其中数据为键,强度为值。

我按如下方式解析 XML 文件:

import xml.etree.ElementTree as ET

tree = ET.parse('File')
root = tree.getroot()

Data_Lst = []
Intensity_Lst = []
count = 0

for Data in root.iter('Data'):
    Data_Lst.append(Data.text)

for Intensity in root.iter('Intensity'):
    Intensity_Lst.append(Intensity.text)
    count += 1
    if count == len(Data_Lst):
       break

print(Data_Lst, Intensity_Lst)

我添加了计数,因为强度列表比数据列表更长。

有什么想法可以为每个部分生成字典吗?

标签: pythonxmldictionary

解决方案


不要分别迭代DataIntensity节点。如果它们不匹配(而您说它们不匹配),您将很快失去同步。

相反,遍历SPEC节点,然后搜索相对节点DataIntensity节点。还要注意我正在使用zip,所以如果SPEC节点内部不匹配,当我们使用较短的列表时,dict 创建将停止。

tree = ET.parse('File')
root = tree.getroot()

for spec_node in root.iter('SPEC'):
    d = dict(zip((data_node.text for data_node in spec_node.iter('Data')),
                 (intensity_node.text for intensity_node in spec_node.iter('Intensity'))))
    print(d)

对于上述文件,此输出

{'100.430000': '2950.909708', '102.269997': '114341.550674', '103.260002': '47164.957890',
 '104.260002': '5102.098056'}
{'100.430000': '2950.909708', '102.269997': '114341.550674', '103.260002': '47164.957890',
 '104.260002': '5102.098056'}

请注意,.text返回字符串。如果您需要浮点数,请float(node.text)在适用的情况下使用。

例如,在不匹配的情况下:

<DATA>
    <DATA_VALUES>
        <SPEC>
            <Meta>1</Meta>
            <Data>1</Data>
            <Intensity>2</Intensity>
            <Data>3</Data>
            <Intensity>4</Intensity>
            <Data>5</Data>
            <Intensity>6</Intensity>
            <Data>7</Data>
            <Intensity>8</Intensity>
            <Data>9</Data>   <!-- This will not be in the dict -->
        </SPEC>
    </DATA_VALUES>
</DATA>

创建的字典将是

{'1': '2', '3': '4', '5': '6', '7': '8'}

推荐阅读