【问题标题】:Updating LXML attributes with values stored in CSV file使用存储在 CSV 文件中的值更新 LXML 属性
【发布时间】:2019-02-19 16:17:12
【问题描述】:

我能够遍历 assets.csv 文件并为每一行创建 XML sn-ps,但是在迭代每个 sigEquipment ID 属性时,我尝试使用每一行的 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>

感谢您的帮助

【问题讨论】:

    标签: python xml pandas csv lxml


    【解决方案1】:

    您的代码有一些问题,所以让我逐行查看。

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

    如果您查看read_csv() 定义,您会看到此函数返回DataFrame。如果您想对其进行迭代,那么您必须指定 how,这将定义您的迭代所看到的 what。在这种情况下,使用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" 存储为 XML 树中每个 SigEquipment 节点的属性 "fileUID"。在 lxml 中,node attributes are handled as a dictionary.

    您现在可以打印该树:

    >>> 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>
    

    【讨论】:

    • 就这么简单!感谢您的帮助并明确定义如何解决问题。
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多