使用存储在 CSV 文件中的值更新 Python lxml etree 子元素属性

Updating Python lxml etree subElement attributes with values stored in CSV file

我是 Python 的新手,我可能忽略了这里的某些内容,但我找不到解决方案。我的问题与此处提出的问题有相似之处,但因为它使用 Pandas 我无法为我的案例找到类似的解决方案:

如何从 CSV 中的行中获取子元素属性而不是将其写为常量?我的测试 CSV 看起来像这样:

Gruppering,Personnummer,Anstallningsnummer,From,Tom,Avtalstillhorighet,Pensionsalder,Anstallningstyp,Avslutsorsak
1967112912341,196711291234,1,2012-05-01,2012-05-31,PA03,65,H3,S7
1979041212341,197904121234,1,2011-03-01,2011-03-31,PA03,65,H3,S7
1979041212342,197904121234,2,2012-03-01,2012-03-31,PA03,65,H3,S7
1979041212343,197904121234,3,2013-03-01,2013-03-31,PA03,65,H3,S7
1977012912341,197701291234,1,2011-11-01,2011-11-30,PA03,65,H3,S7
1974040412341,197404041234,1,2011-03-01,2011-03-31,PA03,65,H3,S7
1988090712341,198809071234,1,2012-06-01,2012-06-30,PA03,65,H3,S7
1988090712342,198809071234,2,2013-06-01,2013-06-30,PA03,65,H3,S7

我的代码创建了一个 XML,如下所示:

<Arbetstagare Personnummer="Test">
    <Anstallning Anstallningsnummer="Test">
      <Period>
        <From>2012-05-01</From>
        <Tom>2012-05-31</Tom>
        <Avtalstillhorighet>PA03</Avtalstillhorighet>
        <Pensionsalder>65</Pensionsalder>
        <Anstallningstyp>H3</Anstallningstyp>
        <Avslutsorsak>S7</Avslutsorsak>
      </Period>
    </Anstallning>
  </Arbetstagare>

我希望属性值不是 Personnummer="Test" 和 Anstallningsnummer="Test",而是 CSV 中第 2 列和第 3 列的值。因此 [=32 的前两行=] 应为:

<Arbetstagare Personnummer="196711291234">
    <Anstallning Anstallningsnummer="1">

我的代码的相关部分如下所示:

from lxml import etree
from itertools import groupby
import csv

with open(r'\ora-2.ug.test.se\utdata\Diverse filer\Öppna H3\Arbetsdokument\TestCSV.csv') as data_file:
    reader = csv.DictReader(data_file)
    f = lambda x: x['Gruppering']
    data = sorted(list(reader), key=f)

    root = etree.Element('root')
    for k, g in groupby(data, key=f):
        Personnummer = etree.SubElement(root, 'Arbetstagare', Personnummer='Test') 
        Anstallningsnummer = etree.SubElement(Personnummer, 'Anstallning', Anstallningsnummer='Test')

我想我必须使用 Personnummer.attrib["Personnummer"] = ???或 Personnummer.set(attr, value) 但如何从 CSV 中获取值?

在查阅了 DictReader 文档后 here 我会推荐这样的东西:

from lxml import etree
from itertools import groupby
import csv

with open(r'TestCSV.csv') as data_file:
    reader = csv.DictReader(data_file)
    root = etree.Element('root')
    for row in sorted(reader, key=lambda x:x['Gruppering']):
        Personnummer = etree.SubElement(root, 'Arbetstagare', Personnummer=row['Personnummer'])
        Anstallningsnummer = etree.SubElement(Personnummer, 'Anstallning', Anstallningsnummer=row['Anstallningsnummer'])
        Period = etree.SubElement(Anstallningsnummer, 'Period')
        etree.SubElement(Period, 'From', ).text = row['From']
        etree.SubElement(Period, 'Tom', ).text = row['Tom']
        etree.SubElement(Period, 'Avtalstillhorighet', ).text = row['Avtalstillhorighet']
        etree.SubElement(Period, 'Pensionsalder', ).text = row['Pensionsalder']
        etree.SubElement(Period, 'Anstallningstyp', ).text = row['Anstallningstyp']
        etree.SubElement(Period, 'Avslutsorsak', ).text = row['Avslutsorsak']

with open('testoutput.xml', 'wb') as f:
    f.write(etree.tostring(root))


data 在你的例子中只是 Python 字典的列表,每个字典中的信息都可以这样访问。

您可能也在考虑如何按“Gruppering”分组,而只需要按它排序。

输出:

<root>
    <Arbetstagare Personnummer="196711291234">
        <Anstallning Anstallningsnummer="1">
            <Period>
                <From>2012-05-01</From>
                <Tom>2012-05-31</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="197404041234">
        <Anstallning Anstallningsnummer="1">
            <Period>
                <From>2011-03-01</From>
                <Tom>2011-03-31</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="197701291234">
        <Anstallning Anstallningsnummer="1">
            <Period>
                <From>2011-11-01</From>
                <Tom>2011-11-30</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="197904121234">
        <Anstallning Anstallningsnummer="1">
            <Period>
                <From>2011-03-01</From>
                <Tom>2011-03-31</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="197904121234">
        <Anstallning Anstallningsnummer="2">
            <Period>
                <From>2012-03-01</From>
                <Tom>2012-03-31</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="197904121234">
        <Anstallning Anstallningsnummer="3">
            <Period>
                <From>2013-03-01</From>
                <Tom>2013-03-31</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="198809071234">
        <Anstallning Anstallningsnummer="1">
            <Period>
                <From>2012-06-01</From>
                <Tom>2012-06-30</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
    <Arbetstagare Personnummer="198809071234">
        <Anstallning Anstallningsnummer="2">
            <Period>
                <From>2013-06-01</From>
                <Tom>2013-06-30</Tom>
                <Avtalstillhorighet>PA03</Avtalstillhorighet>
                <Pensionsalder>65</Pensionsalder>
                <Anstallningstyp>H3</Anstallningstyp>
                <Avslutsorsak>S7</Avslutsorsak>
            </Period>
        </Anstallning>
    </Arbetstagare>
</root>