Problem: 将第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中,如

下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<root>
<students>
<!--
学生信息表
"id" : [名字, 数学, 语文, 英文]
-->
{
"1" : ["张三", 150, 120, 100],
"2" : ["李四", 90, 99, 95],
"3" : ["王五", 60, 66, 68]
}
</students>
</root>

Solution: Write Excel Data to XML, Python:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Date : 2015-03-26 10:56:53
# @Author : NSSimacer
# @Version : 1.0
import sys
from xlrd import open_workbook
from xml.dom import minidom
# 设置系统编码为 UTF-8,处理中文乱码问题
reload(sys)
sys.setdefaultencoding('utf-8')
def load_excel_data_as_dict(f_path):
'''
从 Excel 文件中读取数据,以 dict 格式返回
'''
dict_content = {}
workbook = open_workbook('students.xlsx', encoding_override='utf-8')
sheet = workbook.sheet_by_name('student') # 根据表单名获得 Excel 表单
for row in xrange(sheet.nrows):
dict_content[str(row + 1)] = sheet.row_values(row)[1:]
return dict_content
def write_data_to_xml(dict_content):
'''
将 dict 格式数据写入 xml 文件
'''
xml_doc = minidom.Document() # 新建 Document 对象
root = xml_doc.createElement('root') # 创建根节点
xml_doc.appendChild(root) # 追加根节点到 Document 对象上
students = xml_doc.createElement('students') # 创建 students 节点
root.appendChild(students) # 追加 students 节点到 Document 对象上
comment = xml_doc.createComment(
"学生信息表\"id\" : [名字, 数学, 语文, 英文]") # 创建注释节点
students.appendChild(comment) # 追加注释节点到 students 节点上
conent = xml_doc.createTextNode(
str(dict_content).encode('utf-8')) # 创建文本节点
students.appendChild(conent) # 追加文本节点到 students 节点上
with open('students.xml', 'wb') as f: # 将数据写入 xml 文件中
f.write(xml_doc.toprettyxml(encoding='utf-8'))
def main():
f_path = 'students.xlsx'
d = load_excel_data_as_dict(f_path)
write_data_to_xml(d)
if __name__ == '__main__':
main()

主要目的是使用 Python 操作 Excel 和 XML,涉及的第三方库有 xlrdxml.dom.minidom. 基本思路是 —— 先从 Excel 文件中读取数据,封装成 dict 或者 json 格式,然后把 dict 或者 json 写入 XML 文件中,如果是直接将 dict 写入 XML,可以考虑使用 dicttoxml,它会解析 dict,把 dict 中的每个键值对作为一个节点写入 XML,但是题目中要求把读出来的数据以字符串的形式写到 XML 的一个元素中,作为其 text 节点。

使用到的 API 有:打开 Excel 文件 open_workbook(self, args),获得表单 work.sheet_by_name/index(self, args),接着再按行或者按列读取,或者读取某个单元格 sheet.cell(self, row, col).value,把读出来的数据封装到 dict 里,再把 dict 写到 XML里,这里涉及的 API 有 minidom.Document(),创建一个 Document 对象,也就是 XML 文档对象,调用 xml_doc.createElement/TextNode/Comment(self, args) 创建所需节点和元素,再把这些节点和元素添加到 XML 文档中 appendChild(self, args),最后把 XML 文档对象写入文件中,这里在写入之前对 XML 文档对象调整了一下样式,使其显示起来正常一些 xml_doc.toprettyxml(self, args).

遗留的问题:dict 中有中文,写入 XML 时,无法正常编/解码。关于 Python 2.x 中文编码吐槽,看这里 python中文字符转义问题

题目来源:Python 练习册,每天一个小程序 THX!