码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-25 22:30:59      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:python   xml   

第 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把字符串中的 ‘&amp;‘, ‘&lt;‘, and ‘&gt;‘,对于其他就无力了

# 存放文件的路径
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把字符串中的 ‘&amp;‘, ‘&lt;‘, and ‘&gt;‘,对于其他就无力了

# 存放文件的路径
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文件

标签:python   xml   

原文地址:http://blog.csdn.net/huangxiongbiao/article/details/45974247

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!