使用存储在 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>
我是 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>