Python Show-Me-the-Code 第 0017,0018,0019 题 写XML文件
2015-05-25 20:42
686 查看
第 0017 题: 将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中,如下所示:
阅读资料 腾讯游戏开发 xml 和 Excel 相互转换
第 0018 题: 将 第 0015 题中的 city.xls 文件中的内容写到 city.xml 文件中,如下所示:
第 0019 题: 将 第 0016 题中的 numbers.xls 文件中的内容写到 numbers.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,把转义后的字符还原回来,再写入文件
切换目录,打开文件
读取文件内容
转为json格式
写入xml文件
0015.写excel文件2.py
0016.写excel文件3.py
表格文件:
student.xls:
city.xls:
numbers.xls:
运行后生成的XML:
student.xml:
city.xml:
numbers.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>
阅读资料 腾讯游戏开发 xml 和 Excel 相互转换
第 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 第 0014,0015,0016 题 写Excel文件
- Show me the code之Python练习册 Q17~19 xml操作
- python操作mysql关系数据库 show me the code 0001-0002
- Show me the code之Python练习册 Q10 生成验证码
- github/python/ show me the code 25题(一)
- python 操作 redis --show me the code 0003
- Show me the code之Python练习册 Q4~7
- Python Show-Me-the-Code 第 0006 题 最重要的词
- Show me the code之Python练习册 Q8~9 html解析
- Show me the code之Python练习册 Q14~16 excel操作
- Python Show-Me-the-Code 第 0001 题 生成激活码
- Python Show-Me-the-Code 第 0009 题 提取网页中的超链接
- Show me the code之Python练习册Q23-留言板
- Show me the code之Python练习册 Q11~12 关键词过滤
- python之 heapq -- show me the code 0006
- Python Show-Me-the-Code 第 0010 题 生成验证码图片
- python show-me-the-code 第0010题
- github/python/ show me the code 25题(二)
- Show me the code之Python练习册 Q13 获取网络图片
- Python Show-Me-the-Code 第 0005 题 批量图片处理