Я бы сделал это очень явно, вместо того, чтобы пытаться взломать xmltodict
в соответствии с вашими потребностями.
Единственный недостаток, который я вижу при таком подходе, - это немного повторения с жестко закодированными заголовками и Имена тегов.
Кроме того, я не знаю, насколько регулярно вы будете вводить XML. Если возможно, что некоторые из тегов не будут присутствовать, вам нужно будет добавить некоторую обработку ошибок (поскольку node.find
вернет None
, тогда .text
приведет к AttributeError
).
rows = []
for abc_node in tree.findall('abc'):
rate_node = abc_node.find('Rate')
fee_node = abc_node.find('fee')
row = {'id': abc_node.find('id').text,
'uniqueid': abc_node.find('uniqueid').text,
'Name': abc_node.find('Name').text,
'rate_mrp': rate_node.find('mrp').text,
'rate_discount': rate_node.find('discount').text,
'rate_discountmonths': rate_node.find('discountmonths').text,
'fee_type': fee_node.find('type').text,
'fee_minimumfee': fee_node.find('minimumfee').text,
'fee_maxfee': fee_node.find('maxfee').text}
rows.append(row)
with open('test.csv', 'w', encoding='utf8') as f:
headers = ['id', 'uniqueid', 'Name', 'rate_mrp', 'rate_discount', 'rate_discountmonths',
'fee_type', 'fee_minimumfee', 'fee_maxfee']
dict_writer = csv.DictWriter(f, fieldnames=headers, lineterminator='\n')
dict_writer.writeheader()
dict_writer.writerows(rows)
Вывод
id,uniqueid,Name,rate_mrp,rate_discount,rate_discountmonths,fee_type,fee_minimumfee,fee_maxfee
23,23_0,,6.40000,10.00%,2,off,"£1,500.75",£10K
35,35_0,,7.90000,5.00%,5,offer,£1k,"£22,000"
Если вы хотите |
в качестве разделителя, просто добавьте delimiter='|'
к csv.DictWriter(f, fieldnames=headers, lineterminator='\n')
, тогда вывод будет
id|uniqueid|Name|rate_mrp|rate_discount|rate_discountmonths|fee_type|fee_minimumfee|fee_maxfee
23|23_0||6.40000|10.00%|2|off|£1,500.75|£10K
35|35_0||7.90000|5.00%|5|offer|£1k|£22,000