Я пытаюсь преобразовать несколько файлов CSV для (два на данный момент) в XML с помощью дерева элементов, но я не получаю точный вывод.Пожалуйста, направьте меня с более эффективным подходом.PS: я новичок здесь.
import csv
import xml.etree.ElementTree as ET
#from bs4 import BeautifulSoup
root = ET.Element('Policy')
with open("policy.csv","r") as p, open("Att.csv","r") as a, open("rider.csv","r") as r:
csv_p = csv.reader(p)
header_p = next(csv_p)
csv_a = csv.reader(a)
header_a = next(csv_a)
csv_r = csv.reader(r)
header_r = next(csv_r)
for row in csv_p:
pid = row[0]
print("\n",pid)
for col in range(len(header_p)):
ET.SubElement(root, header_p[col]).text = str(row[col])
for childrow in csv_a:
if(pid == childrow[0]):
print("Match found")
child = ET.SubElement(root,"child")
for col_a in range(len(header_a)):
ET.SubElement(child, header_a[col_a]).text = str(childrow[col_a])
for tailrow in csv_r:
if(childrow[1] == tailrow[0]):
print("tail found",tailrow[0])
tail = ET.SubElement(child,"tail")
for col_r in range(len(header_r)):
ET.SubElement(tail, header_r[col_r]).text = str(tailrow[col_r])
r.seek(0)
a.seek(0)
tree = ET.tostring(root, encoding="UTF-8")
#print(BeautifulSoup(tree, "xml").prettify())
with open("Output.xml", "wb") as f:
f.write(tree)
with open('Output.xml', 'r') as f:
print("\n\n",f.read())
Вывод выглядит так, как показано ниже, но, как вы можете видеть, некоторые теги повторяются, потому что они избыточны в файлах, которые я читаю:
Policy.csv:
Pid,Name,Date
101,Life In,3Jan2017
102,Mobile,8Aug2018
Att.csv :
PId,AId,Name
101,9001,Pune
101,9002,Mumbai
102,9003,Delhi
rider.csv :
AId,RID,Name
9001,10001,Ramesh
9001,10002,Suresh
9002,10003,Rahul
9002,10004,Kirti
Выход :
<Policy>
<Pid>101</Pid>
<child>
<PId>101</PId>
<tail><AId>9001</AId>
<RID>10001</RID>
<Name>Ramesh</Name>
</tail>
<tail>
<AId>9001</AId>
<RID>10002</RID>
<Name>Suresh</Name>
</tail>
<AId>9001</AId>
<Name>Pune</Name>
</child>
<child>
<PId>101</PId>
<tail><AId>9002</AId>
<RID>10003</RID>
<Name>Rahul</Name>
</tail>
<tail><AId>9002</AId>
<RID>10004</RID>
<Name>Kirti</Name>
</tail>
<AId>9002</AId>
<Name>Mumbai</Name>
</child>
<Name>Life In</Name>
<Date>3Jan2017</Date>
</Policy>
Экземпляр желаемого выхода:
<Policy>
<Pid>101</Pid>
<child>
<AId>9001</AId>
<tail>
<RID>10001</RID>
<Name>Ramesh</Name>
</tail>
<tail>
<RID>10002</RID>
<Name>Suresh</Name>
</tail>
<Name>Pune</Name>
</child>
<Name>Life In</Name>
<Date>3Jan2017</Date>
</Policy>