0%

Python练习册:0017

题目

    将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中,如下所示:
	<?xml version="1.0" encoding="UTF-8"?>
	<root>
	<students>
	<!-- 
		学生信息表
		"id" : [名字, 数学, 语文, 英文]
	-->
	{
		"1" : ["张三", 150, 120, 100],
		"2" : ["李四", 90, 99, 95],
		"3" : ["王五", 60, 66, 68]
	}
	</students>
	</root>

分析

先用xlrd读取xls表格里的数据,接着去按照指定格式写入到xml文件,这里我们用xml.dom.minidom去操作xml对象。

pip install xlrd

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import xml.dom.minidom as md
import xlrd


#读取xml内容到字典对象
def read_xls(filename, sheetname):
#打开student.xls
xls = xlrd.open_workbook(filename)
#读取student表
sheet = xls.sheet_by_name(sheetname)
data = {}
# 获取每行内容,以row为键,后面的列表为值,放到字典
for n in range(sheet.nrows):
row_d = sheet.row_values(n)
data[row_d[0]] = list(row_d[1:])

return data


#按照题目要求美化字符串
def pretty_str(dicts):
text = "".join('{\n')
for k in sorted(dicts.keys()):
lists = dicts[k]
s = '\t\t\t"%s" : ["%s", %d, %d, %d],\n' % (
int(k), lists[0], int(lists[1]), int(lists[2]), int(lists[3]))
text += s
text += '\t\t}'
text = text[::-1].replace(',', '', 1)[::-1] #处理列表最后一项后面的,

return text


#写入到xml
def write_xml(xmlname, data, comment):
#新建xml文档对象
xml = md.Document()
#创建根节点
root = xml.createElement('root')
#创建student节点
child = xml.createElement(xmlname)
#先加入root节点
xml.appendChild(root)
#在root节点下加入student节点
root.appendChild(child)

#在student节点下添加注释
comment = xml.createComment(comment)
child.appendChild(comment)
#在student节点下写入文字内容
xmlcontent = xml.createTextNode(data)
child.appendChild(xmlcontent)

#美化后,保存到student.xml,"会被转义为&quot,这里我们替换回来
with open(xmlname + '.xml', 'w') as f:
f.write(xml.toprettyxml().replace('&quot;', '"'))


if __name__ == "__main__":
comment = '学生信息表 "id" : [名字, 数学, 语文, 英文]'
data = read_xls('student.xls', 'student')
data = pretty_str(data)
write_xml('student', data, comment)

参考

欢迎关注我的其它发布渠道