python - 从 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)
我添加了计数,因为强度列表比数据列表更长。
有什么想法可以为每个部分生成字典吗?
解决方案
不要分别迭代Data
和Intensity
节点。如果它们不匹配(而您说它们不匹配),您将很快失去同步。
相反,遍历SPEC
节点,然后搜索相对节点Data
和Intensity
节点。还要注意我正在使用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'}
推荐阅读
- rust - 满足函数参数的生命周期
- python - 在 selenium 上未按名称/ID 找到元素
- r - 从未定义泛型函数的包中导入 S3 方法
- networking - 如何从虚拟机按名称访问 GCP 中的 kubernetes 服务?
- gitlab - 如何创建一个工件,以便它可以在 .gitlab-ci.yml 中下载
- c# - C#中varargin的设计解决方案
- javascript - 需要在算术级数中找到隐藏元素
- video - 为什么同一视频的不同帧大小不同?
- java - Mongo的自动增量功能无法将Long设置为_id?
- asp.net - 可以在 ASP.net 项目上重命名 ValuesController 类吗?