数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。所以用 Python 进行数据相关的工做时,不免要和 Excel 打交道。
若是仅仅是要以表单形式保存数据,能够借助 CSV 格式(一种以逗号分隔的表格数据格式)进行处理,Excel 也支持此格式。但标准的 Excel 文件(xls/xlsx)具备较复杂的格式,并不方便像普通文本文件同样直接进行读写,须要借助第三方库来实现。
经常使用的库是 python-excel 系列:
xlrd、xlwt、xlutilspython
安装的方法没啥特别的,只是得装三遍。能够下载安装包、下载代码压缩包、或者经过 pip 等。可参考 如何安装 Python 的第三方模块 - Crossin的编程教室 - 知乎专栏
若是安装过以前推荐的 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]
...
经常使用的方法:测试
仍是看代码:
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')
生成文件:excel
经常使用的方法:orm
很遗憾,并无直接修改 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。不要问我为何,我也很想知道这么设定的用意何在……
时间转换ip
若是表单中有时间格式的数据,经过处理以后,你会发现时间数据出了差错。get
输出单元格内容:
[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)
具体细节及更多功能这里不展开说明。it