Обновление атрибутов LXML значениями, хранящимися в файле CSV - PullRequest
0 голосов
/ 14 сентября 2018

Я могу пройтись по файлу assets.csv и создать фрагменты XML для каждой строки, однако я пытаюсь заполнить каждый атрибут идентификатора sigEquipment значением идентификатора из каждой строки при итерации по нему.

Ниже приведен снимок assets.csv

ID,CODE,EL,TR,DIR,MIL,X,Y,Z,DESC
30734,X1,CC1,8100,,008+0249 (9-1497),518169.12,185128.27,37.52,
31597,X10,BB1,9100,,008+0286 (9-1460),518151.38,185157.1,36.7,XXX

, и код на данный момент:

import pandas as pd
from lxml import etree as et

df = pd.read_csv('assets.csv', sep=',')

root = et.Element('SchemeData', xmlns='boo')

for row in df:
    equipment= et.SubElement(root, 'Equipment')
    sigEquipment = et.SubElement(equipment, 'SigEquipment', ID='', name='')
    sigEquipment.set('ID', str(df['ID'].iloc[0]))


print(et.tostring(root, pretty_print=True).decode('utf-8'))

Я не уверен, как правильно кодировать эту часть sigEquipment.set('ID', str(df['ID'].iloc[0])) КакМожно ли будет заполнить правильный идентификатор для каждой строки.

В настоящее время я получаю

<SchemeData xmlns="boo">
    <Equipment>
        <SigEquipment fileUID="30734" name=""/>
    </Equipment>
    <Equipment>
        <SigEquipment fileUID="30734" name=""/>
    </Equipment>
</SchemeData>

Спасибо за любую помощь

1 Ответ

0 голосов
/ 15 сентября 2018

Есть несколько проблем с вашим кодом, поэтому позвольте мне пройти эту строку за строкой.

>>> import pandas
>>> df = pandas.read_csv("assets.csv")

Если вы посмотрите на определение read_csv(), то увидите, что эта функция возвращает DataFrame . Если вы хотите выполнить итерацию, вам нужно указать как , и это определит то, что увидит ваша итерация. В этом случае использование iterrows() полезно и возвращает двукратный корень индекса строки и данных строки:

>>> for index, row in df.iterrows():
...     print(index, row["ID"])
... 
0 30734
1 31597

Как видите, столбцы можно индексировать с использованием их имен (как определено в первой строке файла CSV). Теперь давайте соберем все это вместе:

>>> import lxml.etree
>>> root = lxml.etree.Element("SchemeData", xmlns="Boo")
>>> for index, row in df.iterrows():
...     equipment = lxml.etree.SubElement(root, "Equipment")
...     sigEquipment = lxml.etree.SubElement(equipment, "SigEquipment")
...     sigEquipment.attrib["fileUID"] = str(row["ID"])
...     sigEquipment.attrib["name"] = ""

Это перебирает строки вашего экземпляра DataFrame, выбирает столбец "ID" для каждой строки и сохраняет это "ID" в качестве атрибута "fileUID" каждого узла SigEquipment в вашем дереве XML. В lxml атрибуты узла обрабатываются как словарь .

Теперь вы можете распечатать это дерево:

>>> print(lxml.etree.tostring(root, pretty_print=True).decode())
<SchemeData xmlns="Boo">
  <Equipment>
    <SigEquipment fileUID="30734" name=""/>
  </Equipment>
  <Equipment>
    <SigEquipment fileUID="31597" name=""/>
  </Equipment>
</SchemeData>
...