实际案例:
某些时候,我们需要将其他格式数据转换为xml,例如,我们要把平安股票csv文件,转换成相应的xml。
pingan.csv:
Data,Open,High,Low,CLose,Volume,Adj Close
2016-06-30,8.69,8.74,8.66,8.70,36220400,8.70
pingan.xml:
<Data>
<Row>
<Date>2016-06-30</Date>
<Open>8.69</Open>
<High>8.74</High>
<Low>8.66</Low>
<Close>8.70</Close>
<Volume>36220400</Volume>
<AdjClose>8.70</AdjClose>
</Row>
</Data>
解决方案:
使用标准库中的xml.etree.ElementTree,构建ElementTree,使用write方法写入文件。
(1) 构建元素Element和元素树ElementTree的使用
from xml.etree.ElementTree import Element, ElementTree
# 创建元素,传入tag
e = Element('Data')
print(e.tag)
# 设置元素的属性和text,get方法能获取属性,set方法能设置属性
e.set('name', 'abc')
print(e.get('name'))
e.text = '123'
print(e.text)
# 为了便于观察,导入tostring方法,
# 它可以看一个元素变成xml以后转换成怎样的字符串
from xml.etree.ElementTree import tostring
print(tostring(e))
# 元素和元素之间关系问题,可以为一个元素添加子元素
e2 = Element('Row')
e3 = Element('Open')
e3.text = '8.69'
# 让open作为row的子元素
e2.append(e3)
print(tostring(e2))
# 然后让Row作为Data的子元素
e.append(e2)
# 去掉Data的text
e.text = None
print(tostring(e))
# 将元素字符串写入到文件当中去,创建ElementTree
et = ElementTree(e)
# 使用write方法直接写文件名
et.write('build_xml.xml')
(2) 实现csv转换成xml
import csv
from xml.etree.ElementTree import Element, ElementTree
def pretty(e, level=0):
# 用于格式化xml数据
if len(e) > 0:
e.text = '\n' + '\t' * (level + 1)
for child in e:
pretty(child, level + 1)
child.tail = child.tail[:-1]
e.tail = '\n' + '\t' * level
def csv_to_xml(f_name): # f_name为文件名
# 读取csv文件
with open(f_name, 'r', encoding='gb18030') as f:
reader = csv.reader(f)
# 获取csv中头部信息
headers = next(reader)
print(headers)
# 常见xml根元素
root = Element('Data')
for row in reader:
e_row = Element('Row')
# 为根结点添加子元素
root.append(e_row)
# 同时迭代每条数据和对应的标签
for tag, text in zip(headers, row):
e = Element(tag)
e.text = text
e_row.append(e)
pretty(root)
# 最终返回元素树
return ElementTree(root)
et = csv_to_xml('000001.csv')
# 将xml数据写到文件中
et.write('000001.xml')