我是 Python 新手,我可能在這里忽略了一些東西,但我找不到解決方案。我的問題與這里提出的問題有相似之處,但因為它使用 Pandas,我一直無法為我的案例找到類似的解決方案:使用存盤在 CSV 檔案中的值更新 LXML 屬性
如何從 CSV 中的行中獲取 subElement 屬性而不是將其寫為常量?我的測驗 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 列的值。所以 XML 的前兩行應該是:
<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 中獲取值?
uj5u.com熱心網友回復:
在此處查閱 DictReader 檔案后,我會推薦以下內容:
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/349662.html
