问题描述
我能够遍历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>
感谢您的协助
1楼
您的代码存在一些问题,因此让我逐行进行介绍。
>>> 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>