2.5 xlsx格式的Excel文件读写——openpyxl

前言

Excel文件有两种常见的格式分别是xls和xlsx,这两种格式的Excel文件最大的不同之处在于,xls格式的每个表(Sheet)最多只能有65536行和256列,而xlsx则最多可以有1048576行和16384列。上一篇文章讲解了如何读写xls格式的Excel文件,这篇文章中,小编将演示如何使用openpyxl包(安装命令:pip3 install openpyxl),完成xlsx格式的Excel文件的简单读写任务。其中,关于“工作簿(workbook)”和工作表(Sheet)之间的关系,请查看“2.4 xls格式的Excel文件读写——xlrd、xlwt”,关于如何安装Python包,请查看“1.1Python开发环境的搭建”。

openpyxl包使用简介

下表中归纳了一个Excel的操作流程中常用的函数方法,其中,如果创建工作簿后,设定工作簿的属性guess_types为True(即workbook.guess_types = True),则数据写入Excel中时,会自动猜测数据的类型,对于小数会作一定的四舍五入处理,具体请看下文中的示例代码的运行结果。

应用实例

任务说明及分析:

现在,这里有两个csv文件(如下两幅图所示),一个存储的是以"LinkID", "Link_start", "Link_end"为列标题的共1529行3列的数据,每个LinkID可以理解为一个点,另外一个csv文件存储的是以"LinkID", "ReportTime", "Volume", "Speed"为列标题的共8878865行4列的数据。我们有一个任务:将这800多万行的数据分割并为多个Excel文件,其中,按照每20个LinkID为一批数据的标准进行分割。

分析该任务,首先我们需要编写Python程序读取csv文件,这只需要导入Python标准库中的cvs模块即可;其次,由于每个LinkID都有上千行数据,因此20个LinkID就可能有上百万上行数据,所以,Microsoft Office Excel2003的xls文件不能满足要求,故使用xlsx格式来存储我们分离出来的数据。

实现上述功能的Python程序代码如下图所示:

下面对上图代码中关键的地方做一些简要的说明:

(1)第8行读取csv文件,使用了列表推导式,最后将列表形式的数据转换为numpy的ndarray类型以便后边的处理,

(2)第55行处理数据时,使用了numpy的排序方法,代码示例中时按照第一列的数据(即LinkID)来进行排序,所有的LinkID都是“HI + 数字 + 字母”的组合(其中字母时a,b,c,d,...)。要注意的是字符串也能进行排序,实际排序时,根据字符串的ASCII与数字的和的大小进行排序。

(3)第62行处理数据时,还是用到了numpy中删除元素的方法,numpy类型的数组可以改变长度,这里删除元素使用的是np.delete方法,其中,删除的条件使用了np.where进行设置;此外,还使用了np.insert方法向二维的numpy类型数组中插入了两列值为空的数据,这是方便之后进行Excel中的单元格合并。

(4)第64和第65行处理数据时,使用了np.insert方法向二维的numpy类型数组中插入了两列值为空的数据,这是方便之后进行Excel中的单元格合并。insert函数的value参数是指定要填充的内容,axis则是指定在哪一个维度上插入,这里我们要插入列,也就是在第二个维度上插入,故axis为1。

程序运行结果分析:

最后执行的结果如下图所示,首先,所有的数据已经成功地按每20个LinkID分割为了77个Excel文件,其次,从下面的第二幅图可以看到,第二列和第三列的第一个LinkID所在的那几行都已经合并了,而且第二列第一个LinkID所在单元格的值为“花园桥”,可见这是符合我们预期的。其中,Speed所在的列,的数据于csv中不同,全部做了保留了一位小数的处理,这是因为代码中设定了工作簿的guess-type属性为True。

欢迎您加入GIS遥感开发QQ群与同行交流

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171220G0BQSG00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区