Python 每日一练(6)

引言

  • 今天的练习可以说是昨天的那个的反操作,今天要尝试将xls文件的内容写入xml文件中
  • 所涉及到的库有xml,xlrd

xls文件内容写入xml

  • python操作excel主要用到xlrdxlwt这两个库,即xlrd是读excelxlwt是写excel的库(就是上一篇用到的那个库)。
  • 而今天的另一个主角xml又是一个什么呢?
  • xml指的是可扩展标记语言eXtensible Markup Language,和json类似也是用于存储和传输数据,还可以用作配置文件。类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签可以随便定义。
  • 有关python解析xml可以看一下这篇文章:https://blog.csdn.net/kongsuhongbaby/article/details/84869838

编程实现分析

  • 这次要做的事可以分为以下几步:读取xls文件内容,将其数据转换成字典存储,创建xml文件并写入
  • 首先是,读取并解析xls文件数据
def GetXlsData(filepath):
    file = xlrd.open_workbook(filepath)#打开一个xls文件,若文件名含有中文,则filepath前要加一个r,写作r‘filepath‘
    sheet = file.sheet_by_index(0)
    #通过索引来获取工作表,也可以选择用名称来获取,则使用sheet_by_name(sheet_name)
    content = {}
    for i in range(sheet.nrows):#sheet.nrows用于获取有效的行数,即写有数据的行
        content.setdefault(sheet.row_values(i)[0],sheet.row_values(i)[1:])
        #将xls文件中数据存入字典,第一个表示序号的当作key,后面的元素当作value
    return(content)
  • xml的操作
def WriteXml(content):
    xmlfile = minidom.Document()#创建xml文件
    
    root = xmlfile.createElement(‘root‘)#创建节点
    students = xmlfile.createElement(‘students‘)#创建节点

    xmlfile.appendChild(root) #在文件中添加root节点
    root.appendChild(students) #在root下添加students节点

    comment = xmlfile.createComment(‘学生信息表 "id" : [名字, 数学, 语文, 英文]‘)
    students.appendChild(comment) #在students标签下添加comment

    xmlcontent = xmlfile.createTextNode(str(content)) #创建文本节点
    students.appendChild(xmlcontent) #在students标签下添加文本内容

    with open(‘Student.xml‘,‘wb‘) as f:
        f.write(xmlfile.toprettyxml(newl=‘\n‘,encoding = ‘utf-8‘)) #写入文件
  • 完整代码
# -*- coding:utf-8 -*-
# Author:Konmu
‘‘‘
将 第 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>
‘‘‘
import xlrd
import xml.dom.minidom as minidom

def GetXlsData(filepath):
    file = xlrd.open_workbook(filepath)#打开一个xls文件,若文件名含有中文,则filepath前要加一个r,写作r‘filepath‘
    sheet = file.sheet_by_index(0)
    #通过索引来获取工作表,也可以选择用名称来获取,则使用sheet_by_name(sheet_name)
    content = {}
    for i in range(sheet.nrows):#sheet.nrows用于获取有效的行数,即写有数据的行
        content.setdefault(sheet.row_values(i)[0],sheet.row_values(i)[1:])
        #将xls文件中数据存入字典,第一个表示序号的当作key,后面的元素当作value
    return(content)

def WriteXml(content):
    xmlfile = minidom.Document()#创建xml文件
    
    root = xmlfile.createElement(‘root‘)#创建节点
    students = xmlfile.createElement(‘students‘)#创建节点

    xmlfile.appendChild(root) #在文件中添加root节点
    root.appendChild(students) #在root下添加students节点

    comment = xmlfile.createComment(‘学生信息表 "id" : [名字, 数学, 语文, 英文]‘)
    students.appendChild(comment) #在students标签下添加comment

    xmlcontent = xmlfile.createTextNode(str(content)) #创建文本节点
    students.appendChild(xmlcontent) #在students标签下添加文本内容

    with open(‘Student.xml‘,‘wb‘) as f:
        f.write(xmlfile.toprettyxml(newl=‘\n‘,encoding = ‘utf-8‘)) #写入文件

if __name__ == "__main__":
    filepath = "C:/Users/Konmu/Desktop/Students.xls"
    content=GetXlsData(filepath)
    WriteXml(content)
  • 另外两题的操作和这个基本一致,只需要改一下文件就可以了
  • xml文件的写入还可以使用如下语句
f=open(‘Snew.xml‘,‘w‘)
    xmlfile.writexml(f,indent = ‘\t‘,newl = ‘\n‘, addindent = ‘\t‘,encoding = ‘utf-8‘)
    f.close()
  • 效果:
    Python 每日一练(6)
    样式什么的,自己手动稍微修改一下就好了,暂时没找到比较好的解决方案

相关推荐