转: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 文件的一些基本方法。实际使用过程中遇到问题或者需要了解更多功能,永远记住两个词:
RTFM、STFW
:)
参考资料:
http://www.python-excel.org/
https://github.com/python-excel
https://github.com/python-excel/tutorial/raw/master/python-excel.pdf
转:Python 与 Excel 不得不说的事的更多相关文章
- [转]用Python读写Excel文件
[转]用Python读写Excel文件 转自:http://www.gocalf.com/blog/python-read-write-excel.html#xlrd-xlwt 虽然天天跟数据打交 ...
- 震惊!当Python遇到Excel后,将开启你的认知虫洞
本文主要内容: 1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...
- Python导出Excel为Lua/Json/Xml实例教程(三):终极需求
相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- python读取excel一例-------从工资表逐行提取信息
在工作中经常要用到python操作excel,比如笔者公司中一个人事MM在发工资单的时候,需要从几百行的excel表中逐条的粘出信息,然后逐个的发送到员工的邮箱中.人事MM对此事不胜其烦,终于在某天请 ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)
算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...
- python操作excel表格(xlrd/xlwt)
最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...
随机推荐
- 自己做的网页页面导航浏览JS/JQuery
需求: 当页面是由一个巨大的表格构成时,浏览器自动会出现纵向和横向滚动条,这时用户浏览页面会出现很蛋疼的感受,那就是恶心的横向滚动条! 为了减缓这种蛋疼的感觉,我尝试做了这个导航器(不知道如何称呼), ...
- 在反射中Member{get{..}set{..}}与Member{get;set;}的区别?
最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码: StringBuilder sb = new StringBuilder(); foreach (var f in t ...
- swiper.js 移动端触摸滑动插件
API链接: http://www.swiper.com.cn/api/start/2014/1218/140.html <body> <div class="swiper ...
- Win8 移除右键菜单中的SkyDrive Pro选项
Step 1:进入注册表编辑器 Win + R键调出运行窗口,然后输入regedit,进入注册表编辑器. Step 2:删除下面的键值 HKEY_CLASSES_ROOT\AllFilesystemO ...
- Windows环境下安装IPython NoteBook
本文的环境:64位windows8,32位python2.7.首先你要保证电脑上装有python,并且设置成环境变量. 1.windows命令行进入到python目录下的Scripts文件,或者在该目 ...
- 使用XStream注解实现Java对象与XML互相转换的代码示例
本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例. 我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...
- java 类型转换:
数值数据类型: 1.自动类型转换 byte->short ->int->long-->float--->double 范转小的类型向范围大的类型号转换,由系统自动完成 ...
- C++发送邮件和附件
c++socketnulldelete服务器stream 头文件 /**************************************************************** ...
- 完美解决Android完全退出程序(转)
背景:假说有两个Activity, Activity1和Activity2, 1跳转到2,如果要在2退出程序,一般网上比较常见的说法是用 System.exit(0) 或是 android.os.Pr ...
- (转)iFrame高度自适应
第一种方法:代码简单,兼容性还可以,大家可以先测试下: function SetWinHeight(obj) { var win=obj; if (document.getElementById) { ...