第 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>
第 0018 题: 将 第 0015 题中的 city.xls 文件中的内容写到 city.xml 文件中,如下所示:
<?xmlversion="1.0" encoding="UTF-8"?>
<root>
<citys>
<!--
城市信息
-->
{
"1" : "上海",
"2" : "北京",
"3" : "成都"
}
</citys>
</root>
第 0019 题: 将 第 0016 题中的 numbers.xls 文件中的内容写到 numbers.xml 文件中,如下
所示:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<numbers>
<!--
数字信息
-->
[
[1, 82, 65535],
[20, 90, 13],
[26, 809, 1024]
]
</numbers>
</root>
这三题跟前面三题一样,看起来都是差不多的,都属于使用Python来把数据从表格中读出来然后按一定格式写入XML文件的问题,解决的方法大致相同,所以就写在一起了。
在前面接触过可以操作表格的Python第三方库:xlrd,xlwt和xlutils。其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改),xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改。这里用xlrd把表格内容读出来即可。
发现了个叫dicttoxml库在处理dict可能挺好用的,可以方便地把python的dict对象转换为xml的字符串,不过因为题目的格式要求在这里不适用。
为了做这三题,查了很多文档,掉进了很多坑,跳进坑里,爬出来,又掉进去。。。
下面说下遇到的一些坑:
在读取时注意要使用orderdict保存,确保元素位置不会改变
各种中文编码问题:有些地方要unicode,有些地方要utf-8
在creat_node时,要写上ensure_ascii=False, encoding=”utf-8” 中文才正常
在保存为XML时,如果使用writexml会转义掉字符得到的XML如下:
而我要的是这样的:
解决办法就是用Node.toxml方法返回DOM的字符串,然后使用HTMLParser,把转义后的字符还原回来,再写入文件
安装xlrd库(如果没有): sudo pip install xlrd
切换目录,打开文件
读取文件内容
转为json格式
写入xml文件
0014.写excel文件1.py
#!/usr/bin/env python
#coding: utf-8
import json
import xlrd
from collections import OrderedDict
import xml.dom.minidom as minidom
import HTMLParser
# 存放文件的路径
filepath = ‘/home/bill/Desktop/student.xls‘
xmlpath = ‘/home/bill/Desktop/student.xml‘
comment = ‘‘‘
<!--
学生信息表
"id" : [名字, 数学, 语文, 英文]
-->
‘‘‘
def readDataToJson():
# 打开表格
data = xlrd.open_workbook(filepath)
sheet = data.sheet_by_index(0)
# 注意要使用orderdict读取,确保元素位置一致
d = OrderedDict()
for i in range(sheet.nrows):
# 读一行,存放到dict中
values = map(lambda x: x.encode(‘UTF8‘) if isinstance(x, unicode) else x, sheet.row_values(i))
d[values[0]] = values[1:]
return d
class MakeXml():
def __init__(self, xmlpath):
self.xmlpath = xmlpath
self.dom = minidom.DOMImplementation().createDocument(None, ‘root‘, None)
self.root = self.dom.documentElement
def creat_node(self, node_name, node_text=None, comment=None):
if None == node_text:
newNode = self.dom.createElement(node_name)
else:
if None != comment:
newText = self.dom.createTextNode(comment+node_text)
else:
newText = self.dom.createTextNode(node_text)
newNode = self.dom.createElement(node_name)
newNode.appendChild(newText)
return newNode
def add_child(self, item, comment=None):
# 注意中文问题
new_node = self.creat_node(‘student‘, json.dumps(item, indent=4, ensure_ascii=False, encoding="utf-8", separators=(‘,‘, ‘: ‘)), comment)
self.root.appendChild(new_node)
def save(self):
# 直接writexml会转义掉字符
# Node.toxml会返回字符串格式的DOM
with open(self.xmlpath, ‘w‘) as f:
html_parser = HTMLParser.HTMLParser()
tranform = html_parser.unescape(self.dom.toxml().decode(‘utf-8‘))
f.write(tranform.encode(‘utf-8‘))
if __name__ =="__main__":
newxml = MakeXml(xmlpath)
newxml.add_child(readDataToJson(), comment)
newxml.save()
0015.写excel文件2.py
#!/usr/bin/env python
#coding: utf-8
import json
import xlrd
from collections import OrderedDict
import xml.dom.minidom as minidom
import HTMLParser
# xml.sax.saxutils中的unescape只能Unescape把字符串中的 ‘&‘, ‘<‘, and ‘>‘,对于其他就无力了
# 存放文件的路径
filepath = ‘/home/bill/Desktop/city.xls‘
xmlpath = ‘/home/bill/Desktop/city.xml‘
comment = ‘‘‘
<!--
城市信息
-->
‘‘‘
def readDataToJson():
# 打开表格
data = xlrd.open_workbook(filepath)
sheet = data.sheet_by_index(0)
# 注意要使用orderdict读取,确保元素位置一致
d = OrderedDict()
for i in range(sheet.nrows):
# 读一行,存放到dict中
values = map(lambda x: x.encode(‘UTF8‘) if isinstance(x, unicode) else x, sheet.row_values(i))
d[values[0]] = values[1]
return d
class MakeXml():
def __init__(self, xmlpath):
self.xmlpath = xmlpath
self.dom = minidom.DOMImplementation().createDocument(None, ‘root‘, None)
self.root = self.dom.documentElement
def creat_node(self, node_name, node_text=None, comment=None):
if None == node_text:
newNode = self.dom.createElement(node_name)
else:
if None != comment:
newText = self.dom.createTextNode(comment+node_text)
else:
newText = self.dom.createTextNode(node_text)
newNode = self.dom.createElement(node_name)
newNode.appendChild(newText)
return newNode
def add_child(self, item, comment=None):
# 注意中文问题
new_node = self.creat_node(‘citys‘, json.dumps(item, indent=4, ensure_ascii=False, encoding="utf-8", separators=(‘,‘, ‘: ‘)), comment)
self.root.appendChild(new_node)
def save(self):
# 直接writexml会转义掉字符
# Node.toxml会返回字符串格式的DOM
with open(self.xmlpath, ‘w‘) as f:
html_parser = HTMLParser.HTMLParser()
tranform = html_parser.unescape(self.dom.toxml().decode(‘utf-8‘))
f.write(tranform.encode(‘utf-8‘))
if __name__ =="__main__":
newxml = MakeXml(xmlpath)
newxml.add_child(readDataToJson(), comment)
newxml.save()
0016.写excel文件3.py
#!/usr/bin/env python
#coding: utf-8
import json
import xlrd
from collections import OrderedDict
import xml.dom.minidom as minidom
import HTMLParser
# xml.sax.saxutils中的unescape只能Unescape把字符串中的 ‘&‘, ‘<‘, and ‘>‘,对于其他就无力了
# 存放文件的路径
filepath = ‘/home/bill/Desktop/numbers.xls‘
xmlpath = ‘/home/bill/Desktop/numbers.xml‘
comment = ‘‘‘
<!--
数字信息
-->
‘‘‘
def readDataToJson():
# 打开表格
data = xlrd.open_workbook(filepath)
sheet = data.sheet_by_index(0)
# 注意要使用orderdict读取,确保元素位置一致
d = []
for i in range(sheet.nrows):
# 读一行,存放到dict中
values = map(lambda x: x.encode(‘UTF8‘) if isinstance(x, unicode) else x, sheet.row_values(i))
d.append(values)
return d
class MakeXml():
def __init__(self, xmlpath):
self.xmlpath = xmlpath
self.dom = minidom.DOMImplementation().createDocument(None, ‘root‘, None)
self.root = self.dom.documentElement
def creat_node(self, node_name, node_text=None, comment=None):
if None == node_text:
newNode = self.dom.createElement(node_name)
else:
if None != comment:
newText = self.dom.createTextNode(comment+node_text)
else:
newText = self.dom.createTextNode(node_text)
newNode = self.dom.createElement(node_name)
newNode.appendChild(newText)
return newNode
def add_child(self, item, comment=None):
# 注意中文问题
new_node = self.creat_node(‘numbers‘, json.dumps(item, indent=4, ensure_ascii=False, encoding="utf-8", separators=(‘,‘, ‘: ‘)), comment)
self.root.appendChild(new_node)
def save(self):
# 直接writexml会转义掉字符
# Node.toxml会返回字符串格式的DOM
with open(self.xmlpath, ‘w‘) as f:
html_parser = HTMLParser.HTMLParser()
tranform = html_parser.unescape(self.dom.toxml().decode(‘utf-8‘))
f.write(tranform.encode(‘utf-8‘))
if __name__ =="__main__":
newxml = MakeXml(xmlpath)
newxml.add_child(readDataToJson(), comment)
newxml.save()
表格文件:
student.xls:
city.xls:
numbers.xls:
运行后生成的XML:
student.xml:
city.xml:
numbers.xml:
Python Show-Me-the-Code 第 0017,0018,0019 题 写XML文件
原文地址:http://blog.csdn.net/huangxiongbiao/article/details/45974247