草庐IT

pandas读写Excel详解

whgiser 2023-10-21 原文

本文为作者原创,转载请注明

文章目录


一、Excel读取

Excel的读取可以采用ExcelFile类和read_excel两种方法,在实际使用中差别不大。其区别可以见e-learn上贴子讨论,观点摘录如下:

  • 除了语法之外没有特别的区别。从技术上讲,ExcelFile是一个类,read_excel是一个函数。在任何一种情况下,实际都是由定义在ExcelFile的_parse_excel解析
  • ExcelFile.parse循环速度更快(存疑)

1. ExcelFile类

类的定义和方法参数感兴趣的可以查看源码
ExcelFile.parse(sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=None, mangle_dupe_cols=True, **kwds)

import pandas as pd
table = pd.ExcelFile('./data/table1.xlsx')
print(type(table))
print(table.sheet_names) ##按顺序获取sheet名称
## 提取表格信息
sheet1 = table.parse(sheet_name=0) #可以使用序号,一次性读取多个用列表[0,1]
sheet2 = table.parse(sheet_name=table.sheet_names[1]) #也可以使用sheet名
print('sheet1:\n{0}\n sheet2:\n{1}'.format(sheet1,sheet2))

输出结果如下:

2. read_excel()方法

pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=None, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, decimal=’.’, comment=None, skipfooter=0, convert_float=None, mangle_dupe_cols=True, storage_options=None)

主要参数解释
io文件路径
sheet_namesheet名称,可以是数字或sheet名,默认‘sheet1 ’
header指定标题行,默认第一行为标题,可以设置多行如[0,1]为标题行
names在header=None的前提下,补充列名
index_col用于指定索引,默认为None,设置多列索引index_col=[0,1]
usecols用于指定读取的列,默认为None,读取第2-4列usecols = [1,2,3]
engine“xlrd”支持.xls,“openpyxl”支持.xlsx
dtype指定数据列的类型,如{‘a’: np.float64, ‘b’: str}
converters转换指定列的函数字典{“A”:lambda x: x/100,“B”:lambda x: x/100}
skiprows省略指定行数的数据,从第一行开始
skipfooter省略指定行数的数据,是从尾部数的行开始

示例如下:

##可以逐个sheet读取,也可以一次读取
st1 = pd.read_excel('./data/table1.xlsx',sheet_name='1班')
st2 = pd.read_excel('./data/table1.xlsx',sheet_name='2班')
table = pd.read_excel('./data/table1.xlsx',sheet_name=[0,1]) ## 一次性读取 st1 = table[0],st2 = table[1]
print('st1:\n{0}\n st2:\n{1}'.format(st1,st2)) #与上面输出结果相同

使用其他参数

st3 = pd.read_excel('./data/table1.xlsx',sheet_name=1,dtype={'体重': int,'分数': float}) 
st4 = pd.read_excel('./data/table1.xlsx',sheet_name=1,converters={'身高':lambda x:x*100,'体重':lambda x:x*2}) 
#Both a converter and dtype were specified for column 体重 - only the converter will be used
st5 = pd.read_excel('./data/table1.xlsx',sheet_name=1,dtype={'体重': int,'分数': float},converters={'身高':lambda x:x*100,'体重':lambda x:x*2})
print('st3:\n{0}\n st4:\n{1}\n st5:\n{2}'.format(st3,st4,st5))

注意:对某一列同时使用dtype和converters,仅仅converter被有效使用

二、Excel写入

1. 写入Excel

有两种方法可以进行写入,使用to_excel方法和ExcelWriter类,如要写入到一个文件中多个sheet,需要使用ExcelWriter类。
ExcelWriter定义如下:
class pandas.ExcelWriter(path, engine=None, date_format=None, datetime_format=None, mode=‘w’, storage_options=None, if_sheet_exists=None, engine_kwargs=None, **kwargs)
to_excel方法:
DataFrame.to_excel(excel_writer, sheet_name=‘Sheet1’, na_rep=’’, float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep=‘inf’, verbose=True, freeze_panes=None, storage_options=None)
ExcelWriter()可以向同一个excel的不同sheet中写入对应的表格数据
代码如下(示例):

#使用pd.to_excel方法
st5.to_excel('./data/table2.xlsx',sheet_name='newSheet')

ExcelWriter类写入流程:基于已创建的writer对象,利用to_excel()方法将不同的dataframe及其对应的sheet名称写入该writer对象中,并在全部表格写入完成之后,使用save()方法来执行writer中内容向对应实体excel文件写入数据的过程
同python文件IO一样,有两种写入方式。writer应该作为上下文管理器,否则,需要调用close() 保持和关闭打开的文件句柄

第一种:

writer = pd.ExcelWriter('./data/table3.xlsx')
st4.to_excel(writer,sheet_name='st4',index=False)
st5.to_excel(writer,sheet_name='st5',index=False)
##数据写出到excel文件中
writer.save()

第二种:

with pd.ExcelWriter('./data/table4.xlsx') as writer:  
    st4.to_excel(writer, sheet_name='st4',index=False)
    st5.to_excel(writer, sheet_name='st5',index=False)

2. 已有Excel增加sheet

mode分为两种写入’w’和追加‘a’,在已有表格中增加sheet使用‘a’模式,指定写入的sheet名称,代码如下(示例):

with pd.ExcelWriter('./data/table4.xlsx',mode='a',engine='openpyxl') as writer:
    st3.to_excel(writer, sheet_name='st3',index=False)

3. 覆盖Excel中已有sheet

如果需要重新写入Excel中某个sheet,直接往Excel写入同名sheet不会覆盖,而是创建一个新的表单(sheet1),需要采用以下方法

with pd.ExcelWriter('./data/table4.xlsx',mode='a',engine='openpyxl') as writer:
    wb = writer.book # openpyxl.workbook.workbook.Workbook 获取所有sheet
    wb.remove(wb['st3']) #删除需要覆盖的sheet
    st1.to_excel(writer, sheet_name='st3',index=False) ##sheet st3的内容更新成st1值

4. 已有sheet中追加数据

读取原表格的Workbook和sheets,赋给writer句柄,保证数据内容的一致。获取拟写入表单的数据行数,从下一行开始写入,需要设置header = False

import pandas as pd
from openpyxl import load_workbook
newdata = pd.DataFrame([('6','LUCY','F',190,135,90),('7','ROB','M',181,145,78),('8','FRADI','M',176,133,80)])#需要新写入的数据
df = pd.read_excel('./data/table4.xlsx',sheet_name='st4') #读取原数据文件和表
writer = pd.ExcelWriter('./data/table4.xlsx',engine='openpyxl')
book = load_workbook('./data/table4.xlsx')
writer.book = book # openpyxl.workbook.workbook.Workbook
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) #{'st4': <Worksheet "st4">, 'st5': <Worksheet "st5">, 'st3': <Worksheet "st3">}
df_rows = df.shape[0] #获取原数据的行数
newdata.to_excel(writer, sheet_name='st4',startrow = df_rows + 1, index = False, header = False)#将数据写入excel中的st3,从第一个空行开始写
writer.save()#保存

有关pandas读写Excel详解的更多相关文章

  1. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  2. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  3. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  4. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  5. ruby-on-rails - Railscasts 第 362 集 - 导出到 Excel : How to avoid the warning message given by Excel 2010 when opening the file? - 2

    当使用RyanBates的Railscasts第362集关于导出到Excel(https://github.com/railscasts/362-exporting-csv-and-excel)的示例应用程序时,我注意到Excel2010(在Windows上)在打开.xls文件时给我一条警告消息我使用“下载为Excel”链接下载的文件。警告内容如下:“您尝试打开的文件...的格式与文件扩展名指定的格式不同。打开文件前请确认文件未损坏且来源可靠。是否要打开现在存档吗?”当我单击"is"时,我可以很好地打开文件。在使用Excel2011(在Mac上)时,我什至没有收到警告消息。但我希望能够

  6. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  7. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  8. ruby-on-rails - 如何在 ruby​​onrails 上将数据从模型导出到 excel 文件 - 2

    我正在尝试将数据从我的模型导出到Excel电子表格。我见过3种方式使用我不明白如何使用的电子表格gem,我看到的示例是写入本地文件,但我正在寻找每次用户点击链接时都会生成一个文件。创建一个名为export的方法,并在那里运行查询,然后在我看来创建一个export.xls文件,然后该文件创建我想将表格导出到excel文件,但是这种做法不允许我创建多张纸。学习了本教程,http://oldwiki.rubyonrails.org/rails/pages/HowToExportToExcel,但是这里没有显示如何将链接放在View中,在我看来我在路由中遗漏了一些东西,我可以提供github以

  9. ruby - 在未安装 Excel 的服务器上使用 Ruby 读写 Excel 文件 - 2

    我需要在一台没有安装Excel的Linux服务器上读写(->转换)Excel文件。对于Python,存在http://www.python-excel.org/.Ruby有类似的东西吗?可能不需要处理最新的Office格式。只需旧的xls文件就足够了。 最佳答案 我同意Gonzih的观点,并且我经常使用roo。它允许我使用模板文件进行读取、写入和写入。该项目在他们的site上有很好的记录。.我总是使用类似的东西:input=Excel.new(path)output=Array.newinput.default_sheet=inpu

  10. ruby - 使用符号读写 Sinatra 参数,例如参数[:id] - 2

    我的表单通过POST接收数据。当我执行putsparams时,我可以看到:{"id"=>"123","id2"=>"456"}现在是命令:putsparams['id']#=>123putsparams[:id]#=>123params['id']='999'putsparams#=>{"id"=>"999","id2"=>"456"}但是当我这样做的时候:params[:id]='888'putsparams我明白了{"id"=>"999","id2"=>"456",:id=>"888"}在IRB中它工作正常:params#=>{"id2"=>"2","id"=>"1"}params

随机推荐