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。

不过今天只说说这三个。

安装


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

如果安装过之前推荐的 anaconda,那么就已经有了 xlrd 和 xlwt,但 xlutils 没有附带在安装包中,使用时仍需另行安装。

读取


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

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 获取指定单元格的数据

写入


还是看代码:

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 在指定单元格写入数据

修改


很遗憾,并没有直接修改 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。不要问我为什么,我也很想知道这么设定的用意何在……

时间转换


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

输出单元格内容:

[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)

具体细节及更多功能这里不展开说明。

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

RTFMSTFW

:)

参考资料:

http://www.python-excel.org/

https://github.com/python-excel

https://github.com/python-excel/tutorial/raw/master/python-excel.pdf


(0)

相关推荐

  • 史上最全Python 操作 Excel库总结!

    为了带大家了解各个库的异同,从而在不同场景下可以灵活使用,本文将横向比较7个可以操作 Excel 文件的常用模块,在比较各模块常用操作的同时进行巩固学习! 首先让我们来整体把握下不同库的特点 &quo ...

  • 普通小白学会Python到底具体能做什么呢?

    为什么那些教Python课程的人不用Python去做技术赚钱? 就像顶级的运动员们都会有很多训练师指导他们训练,训练师们具备专业知识.专业技能,却不会自己上场比赛,原因有二:其一是黄金年龄段已经过了, ...

  • selenium实现excel文件数据的读、写

    selenium实现excel文件数据的读.写在进行软件测试或设计自动化测试框架时,一个不可避免的过程就是: 参数 化,在利用 python 进行自动化测试开发时,通常会使用 excel 来做数据管  ...

  • python操作Excel的几个库

    包太多,感觉有点乱,啥时候来一个同时支持.xls..xlsx读写的统一一下?pandas可能是一种选择,但也离不开其它几个库的支持.包版本xls读xlsx读xls写xlsx写备注xlrd1.1.0(2 ...

  • 第103天: Python 操作 Excel

    之前看过一篇文章,说一个工作多年的老员工,处理数据时只会用复制粘贴到 Excel ,天天加班工作还完不成,后来公司就招了一个会 Python 的新人,结果分分钟就处理完成.所以工作中大家经常会使用 E ...

  • 【python】解析Excel中使用xlrd库、xlwt库操作,使用xluils库修改Excel文件详解(三)

    之前介绍了读和写excel,前两种都不是修改excel的,但是在实际的工作中,经常会遇到修改已经存在的Excel文件这种需求.xlrd中put_cell可以实现原表格上简单的写入,而xlwt直接生成新 ...

  • Excel中身份证号码验证,那些不得不说的事

    大家在处理员工信息的时候,应该都有处理过身份证号码吧.身份证号码里包含了很多信息,包括出生地.年龄.性别.生日.生肖.星座等等.今天我们不说如何提取这些信息,说一个更重要的身份证号码录入,毕竟有了数据 ...

  • Python 与 Excel 终于互通了 !

    重磅干货,第一时间送达 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 机器之心报道,参与:思源.张倩 很多开发者说自从有了 Python/Pandas,Excel ...

  • 话有三不说,事有三不做,人有三不交

    不说缺德的话,毕竟这样的话让人心寒,说的多了,自己满身负能量,说的少了,也是讨人烦,何必因为一句话,耽误自己的前程. 缺德的话,让人怕,让人担心,虽然居高临下,损失的不仅是人缘,还损失未来的友情. 不 ...

  • 逢人不说人间事,便是人间无事人

    曾有人戏言:"人活于世,便是'人活于事'." 世间人千千万,人间事万万千. 有人"家事国事天下事,事事关心",有人"了却君王天下事,赢得生前身后名&q ...

  • 菜鸟记139-再聊聊EXCEL中数据核对的事(合集)

    注:本图由专业摄影师甜甜溪水授权使用 关键词:EXCEL2016:WORD2016:数据查重:操作难度**** 写在前面的话:小菜在一百多篇公众号文章里,多次提到了数据查重的方法.数据比对是教学管理人 ...

  • 聊一聊Excel累计那点事

    今天分享一下,日常会涉及到的累计相关知识!比如按月累计.汇总从往外下累计等! 我们先从简单的开始! 案例01 | 最基本的从上往下累计 =SUM($B$2:B2) 点破: =SUM($B$2:B2)  ...

  • Python对excel的基本操作

    目录 1. 前言 2. 实验环境 3. 基本操作 3.3.1 获取工作表 3.3.2 遍历工作表 3.3.3 获取单元格数据 3.3.4 遍历行 3.3.5 遍历列 指定行 指定行范围 方法iter_ ...

  • 古训:逢人不说人间事,便是人间无事人

    点击下方[小故事悟大智慧]关注我们 古人云:逢人不说人间事,便是人间无事人 管住嘴,该说的说,不该说的不说,人生就才能避祸得福. 不说是非 在网络时代,人们传播流言的成本极低,所以键盘侠大行其道. 他 ...

  • 鬼谷子:逢人不说人间事,便是人间无事人。智慧自在其中

    春有百花秋有月,夏有凉风冬有雪. 若无闲事挂心头,便是人间好时节.--兹心 古人云:逢人不说人间事,便是人间无事人. 真正有智慧的人,不为是非所累,流言往往始于庸者,止于智者,说人是非者,必是是非之人 ...