python数据包处理模块_Python处理Excel模块的对比分析

码不理课堂开课啦!

数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道。如果仅仅是要以表单形式保存数据,可以借助CSV 格式(一种以逗号分隔的表格数据格式)进行处理,Excel 也支持此格式。但标准的 Excel文件(xls/xlsx)具有较复杂的格式,并不方便像普通文本文件一样直接进行读写,需要借助第三方库来实现。

常用的库是 python-excel 系列:xlrd、xlwt、xlutils

xlrd- 读取 Excel 文件

xlwt- 写入 Excel 文件

xlutils- 操作 Excel 文件的实用工具,如复制、分割、筛选等

尽管这是目前被用得最多的 Excel 库,我还是很想吐槽为什么这三个包不能放在一个模块里……另外它们有个缺陷,就是只能处理 xls 文件。如果你想用新版本的 xlsx,可以考虑 openpyxl 和 xlsxwriter。

不过今天只说说这三个

Part.1 安装

安装的方法没啥特别的,只是得装三遍可以下载安装包、下载代码压缩包、或者通过 pip 等。(可参考

Part.2 读取

结合一段简单的代码来看:

import xlrd

# 打开 xls 文件

book = xlrd.open_workbook("test.xls")

print "表单数量:", book.nsheets

print "表单名称:", book.sheet_names()

# 获取第1个表单

sh = book.sheet_by_index(0)

print u"表单 %s 共 %d 行 %d 列" % (sh.name, sh.nrows,sh.ncols)

print "第二行第三列:", sh.cell_value(1, 2)

# 遍历所有表单

for s in book.sheets():

for r in range(s.nrows):

# 输出指定行

print s.row(r)

测试文件:

输出结果:

表单数量: 2

表单名称: [u'Group.A', u'Group.B']

表单 Group.A 共 7 行 3 列

第二行第三列: 15.0

[text:u'Rank', text:u'Team', text:u'Points']

[number:1.0, text:u'Brazil', number:15.0]

[number:2.0, text:u'Russia', number:12.0]

...

常用的方法:

*open_workbook 打开文件

*sheet_by_index 获取某一个表单

*sheets 获取所有表单

*cell_value 获取指定单元格的数据

Part.3 写入

还是看代码:

import xlwt

# 创建 xls 文件对象

wb = xlwt.Workbook()

# 新增一个表单

sh = wb.add_sheet('A Test Sheet')

# 按位置添加数据

sh.write(0, 0, 1234.56)

sh.write(1, 0, 8888)

sh.write(2, 0, 'hello')

sh.write(2, 1, 'world')

# 保存文件

wb.save('example.xls')

生成文件:

常用的方法:

*Workbook 创建文件对象

*add_sheet 新增一个表单

*write 在指定单元格写入数据

Part.4 修改

很遗憾,并没有直接修改 xls 文件的方法。通常的做法是,读取出文件,复制一份数据,对其进行修改,再保存。

在复制时,需要用到 xlutils 中的方法:

from xlrd import open_workbook

from xlutils.copy import copy

# 打开文件

rb = open_workbook("example.xls")

# 复制

wb = copy(rb)

# 选取表单

s = wb.get_sheet(0)

# 写入数据

s.write(0, 1, 'new data')

# 保存

wb.save('example.xls')

修改后文件:

特别要注意的是:选取读取表单时,要使用 sheet_by_index,而在选取写入表单时,则要用 get_sheet。不要问我为什么,我也很想知道这么设定的用意何在……Part.5时间转换

如果表单中有时间格式的数据,通过处理之后,你会发现时间数据出了差错

输出单元格内容:[number:8888.0, xldate:42613.0]

因为这里 xldate 有自己的格式定义。如果要使用正确的格式,必须转换:

new_date = xlrd.xldate.xldate_as_datetime(date,book.datemode)date 是对应单元格的数据,book 是打开的文件对象。

另外,在打开文件时,加上参数 formatting_info=True,可以保证在时间数据在 copy 时保持原样。

写入时间数据,则可通过此方法创建 excel 的时间对象:xlrd.xldate.xldate_from_datetime_tuple

或者通过 xlwt.easyxf 指定时间格式:

style = xlwt.easyxf(num_format_str='D-MMM-YY')

ws.write(1, 0, datetime.now(), style)

课堂拓展(资源篇)

处理excel的大量python包

网页上爬下来的大量数据需要清洗?成堆的科学实验数据需要导入excel进行分析?作为人生苦短的 Python 程序员,该如何优雅地操作 Excel?

得益于前人的辛勤劳作,Python 处理 Excel 已有很多现成的轮子,使用较多的有:

xlwings:简单强大,可替代VBA

openpyxl:简单易用,功能广泛

pandas:使用需要结合其他库,数据处理是pandas立身之本

win32com:不仅仅是excel,可以处理office;

Xlsxwriter:丰富多样的特性,直接创造一份美观大方的excel,代码即一切;

DataNitro:作为插件内嵌到excel中,可替代VBA,在excel中优雅的使用python

xlutils:结合xlrd/xlwt,老牌python包,需要注意的是你必须同时安装这三个库

课堂拓展(模块对比)

各种模块比较

从运行环境、文档操作、基本功能和性能等方面对以上模块进行一次粗浅的比较

1. 环境配置

再好的模块,也需要在正确的 Python 版本以及 Excel 版本才可运行。

提醒及注意:

xlutils 仅支持 xls 文件,即2003以下版本;

win32com 与 DataNitro 仅支持 windows 系统;

xlwings 安装成功后,如果运行提示报错“ImportError: no module namedwin32api”,请再安装 pypiwin32 或者 pywin32 包;

win32com 不是独立的扩展库,而是集成在其他库中,安装 pypiwin32 或者pywin32 包即可使用;

DataNitro 是 Excel 的插件,安装需到官网下载。

2. 文档操作

虽然大家都是操作 Excel,但即使最基本的新建文件、修改文件、保存文件等功能,在不同的库中也存在差异。比如 xlsxwriter 并不支持打开或修改现有文件,xlwings 不支持对新建文件的命名,DataNitro 作为 Excel 插件需依托于软件本身,pandas 新建文档需要依赖其他库等等。

3. 基本功能

由于设计目的不同,每个模块通常着重于某一方面功能,各有所长。

xlwings

可结合 VBA 实现对 Excel 编程,强大的数据输入分析能力,同时拥有丰富的接口,结合 pandas/numpy/matplotlib 轻松应对 Excel 数据处理工作。

openpyxl

简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等等功能应有尽有,图表功能是其一大亮点,缺点是对 VBA 支持的不够好。

pandas

数据处理是 pandas 的立身之本,Excel 作为 pandas 输入/输出数据的容器。

win32com

从命名上就可以看出,这是一个处理 windows 应用的扩展,Excel 只是该库能实现的一小部分功能。该库还支持 office 的众多操作。需要注意的是,该库不单独存在,可通过安装 pypiwin32 或者 pywin32 获取。

xlsxwriter

拥有丰富的特性,支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比 openpyxl 还支持 VBA 文件导入,迷你图等功能,缺点是不能打开/修改已有文件,意味着使用 xlsxwriter 需要从零开始。

DataNitro

作为插件内嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python 脚本。既然被称为 Excel 中的 python,协同其他 python 库亦是小事一桩。然而,这是付费插件...

xlutils

基于 xlrd/xlwt,老牌 python 包,算是该领域的先驱,功能特点中规中矩,比较大的缺点是仅支持 xls 文件。

4.性能

我们对几个库做了最基本的写入和读取测试,分别使用不同库进行添加及读取1000行 * 700列 数据操作,得到所用时间,重复操作取平均值。另外在不同的电脑配置,不同的环境下结果肯定会有出入,数据仅供参考。

注:xlutils 最多只能写入 256 列,即 1000*256,用时3.8秒,表现不错;DataNitro 与 xlsxwriter 不能打开 Excel 文件。

5. 小结

通过以上的分析,相信大家对几个库都有了简单的了解。在编写文章的过程中,笔者也在思考各个库最适合的应用场景。

不想使用GUI 而又希望赋予Excel 更多的功能,openpyxl 与xlsxwriter,你可二者选其一;

需要进行科学计算,处理大量数据,建议pandas+xlsxwriter或pandas+openpyxl;

想要写 Excel 脚本,会 Python 但不会 VBA 的同学,可考虑 xlwings 或DataNitro;

至于 win32com,不管是功能还是性能都很强大,有 windows 编程经验的同学可以使用。不过它相当于是 windows COM 的封装,自身并没有很完善的文档,新手使用起来略有些痛苦。

你可根据自己的需求和生产环境,选择合适的 Python-Excel 模块。

课 堂 拓 展 ( 对 比 篇)

通过选中单元格并查看开始菜单中的数值类型来判断数据的格式。

python与excel的功能对比1.生成数据表

EXCEL:生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据。 Excel中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导入。

python:支持从多种类型的数据导入。在开始使用python进行数据导入前需要先导入pandas库,为了方便起见,我们也同时导入numpy库。

2.查看数据格式

Excel:通过选中单元格并查看开始菜单中的数值类型来判断数据的格式。

Python:中使用dtypes函数来返回数据格式。

3.处理空值(删除或填充)

我们在创建数据表的时候在price字段中故意设置了几个NA值。对于空值的处理方式有很多种,可以直接删除包含空值的数据,也可以对空值进行填充,比如用0填充或者用均值填充。还可以根据不同字段的逻辑对空值进行推算。

Excel:中可以通过“查找和替换”功能对空值进行处理,将空值统一替换为0或均值。也可以通过“定位”空值来实现。

Python:中处理空值的方法比较灵活,可以使用 Dropna函数用来删除数据表中包含空值的数据,也可以使用fillna函数对空值进行填充。下面的代码和结果中可以看到使用dropna函数后,包含NA值的两个字段已经不见了。返回的是一个不包含空值的数据表。

4.更改数据格式

Excel:中通过“设置单元格格式”功能可以修改数据格式。Python中通过astype函数用来修改数据格式。

Python:中dtype是查看数据格式的函数,与之对应的是astype函数,用来更改数据格式。下面的代码中将price字段的值修改为int格式。

课堂拓展(代码示例)

6.1 xlwings基本代码

import xlwings as xw

#连接到excel

workbook = xw.Book(r'path/myexcel.xlsx')#连接excel文件

#连接到指定单元格

data_range = workbook.sheets('Sheet1').range('A1')

#写入数据

data_range.value = [1,2,3]

#保存

workbook.save()

6.2 xlsxwriter基本代码

import xlsxwriter as xw

#新建excel

workbook = xw.Workbook('myexcel.xlsx')

#新建工作薄

worksheet = workbook.add_worksheet()

#写入数据

worksheet.wirte('A1',1)

#关闭保存

workbook.close()

6.3 xlutils基本代码

import xlrd #读取数据

import xlwt #写入数据

import xlutils #操作excel

#----xlrd库

#打开excel文件

workbook = xlrd.open_workbook('myexcel.xls')

#获取表单

worksheet = workbook.sheet_by_index(0)

#读取数据

data = worksheet.cell_value(0,0)

#----xlwt库

#新建excel

wb = xlwt.Workbook()

#添加工作薄

sh = wb.add_sheet('Sheet1')

#写入数据

sh.write(0,0,'data')

#保存文件

wb.save('myexcel.xls')

#----xlutils库

#打开excel文件

book = xlrd.open_workbook('myexcel.xls')

#复制一份

new_book = xlutils.copy(book)

#拿到工作薄

worksheet = new_book.getsheet(0)

#写入数据

worksheet.write(0,0,'new data')

#保存

new_book.save()

6.4 win32com基本代码

import win32com.client as wc

#启动Excel应用

excel_app = wc.Dispatch('Excel.Application')

#连接excel

workbook = excel_app.Workbooks.Open(r'e:/myexcel.xlsx' )

#写入数据

workbook.Worksheets('Sheet1').Cells(1,1).Value = 'data'

#关闭并保存

workbook.SaveAs('newexcel.xlsx')

excel_app.Application.Quit()

6.5 openpyxl基本代码

import openpyxl

# 新建文件

workbook = openpyxl.Workbook()

# 写入文件

sheet = workbook.activesheet['A1']='data'

# 保存文件

workbook.save('test.xlsx')

6.6 DataNitro基本代码

#单一单元格赋值

Cell('A1').value = 'data'

#单元区域赋值

CellRange('A1:B2').value = 'data'

课堂总结以上便是 Python 和 Excel 文件的一些基本方法和基础知识。实际使用过程中遇到问题或者需要了解更多功能,永远记住两个词:

RTFM、STFW

:)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值