python 数据分析基础二:excel文件处理(一) 开端

之前博主已经讲完了对csv文件的操作,而且讲的也算比较细吧。那么需要学习数据处理这块内容的小伙伴可以继续关注博主。博主会继续从excel文件处理开始

对excel文件的处理

excel在商业活动运用十分广泛,人们使用excel的方式五花八门。
与python的csv模块不同,python中并没有处理excel文件的标准模块,因此我们学习本章内容需要安装两个拓展包xlrdxlwt如果小伙伴安装了Anaconda python 那么便可以直接使用,这里博主推荐大家如果觉得pycharm或者vs使用起来比较麻烦的话可以使用jupyter lab,这是博主常用一个python 笔记本。下载的话:

  1. 打开cmd
  2. 输入指令 pip install jupyterlab
  3. 进度条加载完毕也就下载完了,你可以在cmd中进入任何目录打开,不过博主建议你新建一个专用的文件夹。
    那么为了学习的开始,我们需要三个excel文件,这个我们可以去一个地址下载:传送门
    当然由于是外网github社区所以会比较慢,但是文件本身并没有特别大,所以小伙伴只需要等待片刻即可

    文件
    在这里插入图片描述

处理单个工作表

我们首先用一段代码来引入学习:

from xlrd import open_workbook
input_file="sales_2013.xlsx"
workbook=open_workbook(input_file)#open_workbook()函数,xlrd模块对excel文件的应用
print("Number of worksheets:",workbook.nsheets)#nsheets()函数,sheet本身具有片的意思,这里应该可以理解为页
for row in workbook.sheets():
    print("Worksheet name:",row.name,"\trows:",row.nrows,"\tcolumns:",row.ncols)#每片的名,行,列

小伙伴们可以看到有很多陌生的字眼。没关系,慢慢来,刚开始接触这个模块开始的小伙伴都很迷茫。

  1. 首先,我们需要导入一些模块和函数,这里我们使用from xlrd import open_workbook可以使我们后面的代码稍微方便一点。(因为不在需要每次引用的时候都在前面加一个xlrd.😢)
  2. 我们还要使用workbook来承接创建的工作对象。
  3. 这里我们使用的是open_workbook函数打开文件,这是xlrd模块中带有的函数吗,专用于打开excel工作簿的,打开方式与open类似,同样的,我们也可以使用with open_workbook() as的形式,后面会用到
  4. workbook.nsheets,nsheets返回所有的工作表的数目,一个工作簿可以有多个工作表
  5. 我们使用for循环来遍历每一个工作表,注意函数**workbook.sheets()**返回所有的工作表。
  6. name,nrows,ncols都是模块里的函数,他们的意思,也与字面意思相同分别是,工作表的名,行数,列数

利用基础python读写excel文件

代码:

#利用基础python读写工作表
from xlrd import open_workbook
from xlwt import Workbook
input_file="sales_2013.xlsx"
out_file="output.xlsx"
out_object=Workbook()#实例化了一个workbook对象,后面会用到
out_work_sheet=out_object.add_sheet("jan_2013_output")#add_sheet为工作簿添加一个工作表
with open_workbook(input_file) as workbook:#获取所有的sheet
    worksheet=workbook.sheet_by_name('january_2013')#根据名引入一个sheet_by_name的工作表
    #print(worksheet.nrows)行数
    for row in range(worksheet.nrows):
        for column in range(worksheet.ncols):
            out_work_sheet.write(row,column,worksheet.cell_value(row,column))#分别为:行索引。列索引,和所获取的单元格的内容
out_object.save(out_file)#保存文件
#利用基础python读写工作表,xlrd模块和xlwt模块
#在out_file上显示的日期数,并没有经过格式化,而是从1990年1月0日至表格日期的天数
#我们如果使用from和import的形式,便不再需要将模块名加在前面

很多内容博主在学习的时候也已经标注清楚,小伙伴可以在代码中自己看自己理解,当然博主也会在 解析

  1. 前文已经说到导入xlrd模块,这里我们还需要导入xlwt模块才可以实现对excel文件的写的操作,相信小伙伴们在字面也看得出来xlrd其实就是read,xlwt其实就是write,这里我们从xlwt导入Workbook。
  2. 需要读取的文件是博主开头展示的第一个文件,需要写入的文件自己创建一个便可。
  3. 这里的写入,我们要注意,我们需要使用刚刚导入Workbook模块去实例化一个可操作的对象,我们接下来需要对这个可操作对象操作
  4. out_work_sheet=out_object.add_sheet(“jan_2013_output”) 这里,我们使用可操作对象,添加一个工作表,使用函数**.add_sheet**,注意前缀使我们实例化的对象,不是需要写入的文件。
  5. 接着我们使用with open语句打开文件,获取所有的工作表,继而使用workbook.sheet_by_name(‘january_2013’) 根据工作表名获取该工作表。
  6. 两个for循环用来遍历单元格的位置坐标x和y,后面会用到
  7. out_work_sheet.write(row,column,worksheet.cell_value(row,column))
    这里的 out_work_sheet 是我们之前创建的工作表的承接对象,write函数
    的第一个参量为行索引,第二个参量为列索引,也就是我们理解的x和y坐标,这两个擦亮为我们提供需要操作的单元格的位置,后面的worksheet.cell_value,其实便是我们之前引用的原工作表的一个单元格的内容
  8. 最后我们使用out_object.save(out_file)保存文件

那么这时候我们打开两个工作簿进行对比会发现一个很明显的问题

原工作簿:
在这里插入图片描述
我们写入的工作簿
在这里插入图片描述
没错,时间出现了问题我们需要注意,这里的时间是从1990年开始计数,到工作表中的时间。而且换算嫦娥了浮点数,并非是格式化的,该浮点数的格式是:(从1990年1月0日到该日期的日期数,加上二十四小时的浮点数)
那么我们就需要格式化日期,这一步是有些麻烦,不过为了精确处理数据,我们还是必须走这一步的😄
代码:

#格式化日期数据,基于上一个代码
from datetime import date
from xlrd import open_workbook,xldate_as_tuple
from xlwt import Workbook
input_file="sales_2013.xlsx"
output_file="output.xlsx"
out_object=Workbook()#实例化一个工作表对象
out_work_sheet=out_object.add_sheet("jan_2013_output")#添加一个工作表
with open_workbook(input_file) as workbook:
    worksheet=workbook.sheet_by_name("january_2013")#根据名选择一个工作表
    for row_index in range(worksheet.nrows):
        row_list_output=[]
        for col_index in range(worksheet.ncols):
            if worksheet.cell_type(row_index,col_index)==3:#3为cell_type所指的时间
                date_cell=xldate_as_tuple(worksheet.cell_value(row_index,col_index),workbook.datemode)#xldate_as_tuple将excel中代表时间的数值转化为元组
                #print(date_cell)经过验证,该语句将时间格式化后的各组数字分别存入一个元组,格式如↓
                #(2013, 1, 1, 0, 0, 0)
                #(2013, 1, 6, 0, 0, 0)
                #(2013, 1, 11, 0, 0, 0)
                #(2013, 1, 18, 0, 0, 0)
                #(2013, 1, 24, 0, 0, 0) 给元组,列表前加 *可以将其拆分为一个个独立的元素,成为三个可以引用的独立对象,且不可迭代
                date_cell=date(*date_cell[0:3]).strftime("%m/%d/%Y")#赋值给date_cell,参数datemode的存在是确定时间是从1990年开始,并据此将数值转化为正确的元组
                row_list_output.append(date_cell)#strftime函数格式化为时间
                out_work_sheet.write(row_index,col_index,date_cell)
            else:
                non_date_cell=worksheet.cell_value(row_index,col_index)#引用工作表的单元格
                row_list_output.append(non_date_cell)
                out_work_sheet.write(row_index,col_index,non_date_cell)
out_object.save(output_file)#保存

这段代码,博主为了讲解清楚研究了有些时间,将其中的一些小的知识点啊,一些函数的运用啊,都做了标记

  1. cell_type()在xlrd模块中,对很多信息进行了分类,而我们利用cell_type便能得到这个“模式”,而3便表示这个单元格中的是时间信息,因此,我们将其单独格式
    拓展

当我们对一个列表或者元组加上 * 的时候,会将元素变为单独的引用对象,如↓
在这里插入图片描述

over 现在是凌晨1.06 博主今天就肝到这里了

😄

需要继续学习python处理excel的小伙伴可以关注博主哦!

武汉加油

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值