当前位置: 代码迷 >> python >> 使用存储在CSV文件中的值更新LXML属性
  详细解决方案

使用存储在CSV文件中的值更新LXML属性

热度:50   发布时间:2023-06-19 09:23:14.0

我能够遍历assets.csv文件并为每一行创建XML代码段,但是,当在其上进行迭代时,我尝试使用来自每一行的ID值填充每个sigEquipment ID属性。

以下是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]))如何为每一行填充正确的ID。

目前我得到

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

感谢您的协助

您的代码存在一些问题,因此让我逐行进行介绍。

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

如果查看定义,则会看到此函数返回一个 。 如果你想遍历它,那么你就必须要指定如何 ,这将定义您的看到的东西 在这种情况下,使用很有用,它返回两列的行索引和行数据:

>>> 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"存储为XML树中每个SigEquipment节点的属性"fileUID" 在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>