Python3-操作excle(xlrd&xlwt&xlutils和pandas)

一,前言

入职数据分析以后,肯定要涉及到python处理excle,特别是涉及到对excle的一些重复操作时,也许能提升一些效率;因此,有必要对python操作excle进行学习。

现有操作excle的工具包有很多,例如xlrd&xlwt&xlutils以及强大的pandas,此外还有别的工具包,但受限于平台或者安装方式,都没有以上两种常用。(其中,pandas不仅是用来操作excle,而是一整套强大的工具包。)

知乎有一篇文章些不同python包操作excle的对比,其中有些内容不太准确,需要自己验证。(知乎链接:https://zhuanlan.zhihu.com/p/23998083)

下面对不同模块对excle进行操作的基本方法进行解释和练习,更高级复杂的操作还需要日后继续深入学习打磨。

二,xlrd,xlwt读写excle

下面是一个读excle的例子:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 17:27:40 2019

@author: chao
"""
import xlrd
import sys
f1 = xlrd.open_workbook(r'C:\Users\chao\Desktop\dataana.xlsx')#打开的这个excel必须存在,否则会报错
filename = sys.argv[0] #获取文件全路径
print('opening the file:'+str(filename)) 
#获取所有sheet页的名字
print('all sheets:'+str(f1.sheet_names()))
#按名字查找第二张表单
# sheet=wb.sheet_by_name('abc2')#根据sheet页的名字获取sheet页
sheet = f1.sheet_by_index(0)#根据sheet页的索引获取sheet页
#获取sheet页的行数和列数
print('num of rows:'+str(sheet.nrows))
print('num of columns:'+str(sheet.ncols))

for rownum in range(sheet.nrows):  #循环取每行的数据

    print(sheet.row_values(rownum))#取每行的数据

    #按照索引打印对应单元格内容
    #cell_location_value=sheet.cell(0,0).value #获取指定单元格的值,第一个值是列,第二个值是行
    #print(cell_location_value)

下面是一个写excle的例子:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 17:37:55 2019

@author: chao
"""
import xlwt
title = ['姓名','年龄','性别','分数']
stus = [['mary',20,'女',89.9],['rmay',21,'女',89.9],['amry',22,'女',89.9],['yram',23,'女',89.9]]
#新建一个excel对象
f1 = xlwt.Workbook()
#添加一个名为sheet1课程表的sheet页
sheet = f1.add_sheet('sheet1')
for i in  range(len(title)):#写入表头
    sheet.write(0,i,title[i])#写入每行,第一个值是行,第二个值是列,第三个是写入的值
for i in range(len(stus)):
    if i !=0:#如果不是表头的话
        for j in range(4):
            sheet.write(i,j,stus[i][j])#循环写入每行数据
 #保存‘test1.xls’文件
f1.save(r'C:\Users\chao\Desktop\test1.xls')#保存xlsx后,会显示文件损坏打不开

xlwt无法完成对已有文件的追加或修改,因此需要下面的xlutils对已有文件进行操作。

三,xlutils修改excle

xlutils实质上仍然需要xlrd和xlwt来完成操作,例子如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 17:37:55 2019

@author: chao
"""
#import xlwt
import xlrd
from xlutils.copy import copy
f1 = xlrd.open_workbook(r'C:\Users\chao\Desktop\dataana.xlsx')
# 复制为新的xlsx
wt_f1 = copy(f1)
# 修改新的xls
wt_sheet = wt_f1.get_sheet(0)
wt_sheet.write(24,1,'追加内容')
# 保存修改
wt_f1.save(r'C:\Users\chao\Desktop\dataana_copy.xls')

四,pandas创建,读写excle

先尝试创建一个空xlsx:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 19:39:51 2019

@author: chao
"""


import pandas as pd
 
 
# 构建数据
df=pd.DataFrame()#构造原始数据文件

# 保存文件
df.to_excel(r'C:\Users\chao\Desktop\pandas_test1.xlsx')

代码运行后能成功保存文件并且可以打开,说明pandas是支持新版本的excle的。

创建指定内容的excle文件:

import pandas as pd
df=pd.DataFrame({'ID':[1,2,3],'Name':['XiaoMing','XiaoHong','XiaoLan']})
df=df.set_index('ID') #指定索引为ID
df.to_excel(r'C:\Users\chao\Desktop\pandas_test1.xlsx')

注意,如果不指定索引,pandas会在左侧自动添加一列索引。

pandas读取excle:

df=pd.read_excel(r'C:\Users\chao\Desktop\dataana.xlsx',sheet_name='Sheet1')
#sheet_name用来指定读取的sheet,省略时默认读取第一个sheet
data=df.head()#默认读取前5行的数据
print("read lines:\n{0}".format(data))#格式化输出
#{}效力等同%

打印出来,会发现,pandas读取数据时也会自动加上索引:

Python3-操作excle(xlrd&xlwt&xlutils和pandas)_第1张图片

读取指定行列:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 19:39:51 2019

@author: chao
"""
import pandas as pd
df=pd.read_excel(r'C:\Users\chao\Desktop\dataana.xlsx',sheet_name='Sheet1')
data=df.loc[1:3]['Age']
print("read lines:\n{0}".format(data))

注意,网上关于pandas很多教程有点老了,新的pandas已经弃用了ix,现在用iloc和loc。

修改指定行列并保存:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 30 19:39:51 2019

@author: chao
"""
import pandas as pd
df=pd.read_excel(r'C:\Users\chao\Desktop\dataana.xlsx',sheet_name='Sheet1')
df.loc[22,'Age']=18.888
df=df.set_index('Name')
print("read lines:\n{0}".format(df))
pd.DataFrame(df).to_excel(r'C:\Users\chao\Desktop\pandas_test1.xlsx', sheet_name='Sheet1')

保存结果:

Python3-操作excle(xlrd&xlwt&xlutils和pandas)_第2张图片

由上述结果可知,pandas能够对新版本的excle进行支持,而xlrd&xlwt&xlutils并不支持xlsx。而xlrd&xlwt&xlutils在有些博客的实验里,读取速度比pandas更快,而后续需要对数据进行分析的话,还是采用pandas是比较好的。

 

你可能感兴趣的:(Python3-操作excle(xlrd&xlwt&xlutils和pandas))