您的位置:首页 > 编程语言 > Python开发

Python Show-Me-the-Code 第 0017,0018,0019 题 写XML文件

2015-05-25 20:42 686 查看
第 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>


阅读资料 腾讯游戏开发 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:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: