Создать несколько словарей Python из файла XML - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть 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)

Я добавил счетчик, потому что список интенсивности длиннее, чем список данных.

Любые идеи, как я могу генерироватьдиктанты для каждого раздела?

1 Ответ

1 голос
/ 05 ноября 2019

Не перебирайте узлы 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...