我有以下xml,我想使用python将其转换为csv(分隔符,如"|"或八进制(。 我尝试将 xml 转换为字典,然后转换为 csv. 我正在寻找是否有任何简单或有效的方法可以做到这一点。
以下代码的问题:
- 有一个标签xyz,在csv中不需要,那么如何转义或忽略它呢?我想要的只是来自标签abc的数据。
- 希望嵌套标签作为底层键的前缀
- 预期输出是一行,其中键作为标题,其下方的值。
XML 示例 :
<?xml version="1.0" encoding="utf-8"?>
<xyz date="2019-07-01T09:00:29">
<abc>
<id>23</id>
<uniqueid>23_0</uniqueid>
<Name></Name>
<Rate>
<mrp>6.40000</mrp>
<discount>10.00%</discount>
<discountmonths>2</discountmonths>
</Rate>
<fee>
<type>off</type>
<minimumfee>£1,500.75</minimumfee>
<maxfee>£10K</maxfee>
</fee>
</abc>
<abc>
<id>35</id>
<uniqueid>35_0</uniqueid>
<Name></Name>
<Rate>
<mrp>7.90000</mrp>
<discount>5.00%</discount>
<discountmonths>5</discountmonths>
</Rate>
<fee>
<type>offer</type>
<minimumfee>£1k</minimumfee>
<maxfee>£22,000</maxfee>
</fee>
</abc>
</xyz>
代码:(不介意代码的不成熟,只是一个初学者,主要是来自多个站点的复制粘贴..试图了解这是否有效,然后认为我会知道从哪里开始或修改现有的(
import xml.etree.ElementTree as ET
import xmltodict
import csv
tree = ET.parse('myxml_1.xml')
xml_data = tree.getroot()
xmlstr = ET.tostring(xml_data, encoding='utf-8', method='xml')
data_dict = dict(xmltodict.parse(xmlstr))
with open('test1.csv','w') as f:
w = csv.writer(f)
w.writerow(data_dict.keys())
w.writerow(data_dict.values())
预期输出 :
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
我会以非常明确的方式执行此操作,而不是试图破解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