设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 4540|回复: 1
打印 上一主题 下一主题

Python 与 Excel 不得不说的事

[复制链接]

169

主题

1

好友

733

积分

版主

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2018-6-11 22:53:54 |只看该作者 |倒序浏览

数据处理是 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。

不过今天只说说这三个。

(更新:有人提到另外几个 Python 处理 Excel 的库,有些的确会比 python-excel 系列好用。之后会再做一篇对比,敬请期待。

另外,关于为什么不用 VBA、Java、C#……处理 Excel。其实本文的出发点是对于 Python 使用者来说,操作 Excel 的一种基本方式,并非否定其他语言和方法。)
安装
安装的方法没啥特别的,只是得装三遍。可以下载安装包、下载代码压缩包、或者通过 pip 等。可参考 如何安装 Python 的第三方模块 - Crossin的编程教室 - 知乎专栏

如果安装过之前推荐的 anaconda,那么就已经有了 xlrd 和 xlwt,但 xlutils 没有附带在安装包中,使用时仍需另行安装。
读取
结合一段简单的代码来看:
  1. import xlrd
  2. # 打开 xls 文件
  3. book = xlrd.open_workbook("test.xls")
  4. print "表单数量:", book.nsheets
  5. print "表单名称:", book.sheet_names()
  6. # 获取第1个表单
  7. sh = book.sheet_by_index(0)
  8. print u"表单 %s 共 %d 行 %d 列" % (sh.name, sh.nrows, sh.ncols)
  9. print "第二行第三列:", sh.cell_value(1, 2)
  10. # 遍历所有表单
  11. for s in book.sheets():
  12.     for r in range(s.nrows):
  13.         # 输出指定行
  14.         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 获取指定单元格的数据写入
还是看代码:
  1. import xlwt
  2. # 创建 xls 文件对象
  3. wb = xlwt.Workbook()
  4. # 新增一个表单
  5. sh = wb.add_sheet('A Test Sheet')
  6. # 按位置添加数据
  7. sh.write(0, 0, 1234.56)
  8. sh.write(1, 0, 8888)
  9. sh.write(2, 0, 'hello')
  10. sh.write(2, 1, 'world')
  11. # 保存文件
  12. wb.save('example.xls')
复制代码
生成文件:

常用的方法:
Workbook 创建文件对象add_sheet 新增一个表单write 在指定单元格写入数据修改
很遗憾,并没有直接修改 xls 文件的方法。通常的做法是,读取出文件,复制一份数据,对其进行修改,再保存。

在复制时,需要用到 xlutils 中的方法。
  1. from xlrd import open_workbook
  2. from xlutils.copy import copy
  3. # 打开文件
  4. rb = open_workbook("example.xls")
  5. # 复制
  6. wb = copy(rb)
  7. # 选取表单
  8. s = wb.get_sheet(0)
  9. # 写入数据
  10. s.write(0, 1, 'new data')
  11. # 保存
  12. wb.save('example.xls')
复制代码
修改后文件:

特别要注意的是,选取读取表单时,要使用 sheet_by_index,而在选取写入表单时,则要用 get_sheet。不要问我为什么,我也很想知道这么设定的用意何在……
时间转换
如果表单中有时间格式的数据,通过处理之后,你会发现时间数据出了差错。

输出单元格内容:
[number:8888.0, xldate:42613.0]
因为这里 xldate 有自己的格式定义。如果要使用正确的格式,必须转换:
  1. new_date = xlrd.xldate.xldate_as_datetime(date, book.datemode)
复制代码
date 是对应单元格的数据,book 是打开的文件对象。

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

写入时间数据,则可通过此方法创建 excel 的时间对象:
  1. xlrd.xldate.xldate_from_datetime_tuple
复制代码
或者通过 xlwt.easyxf 指定时间格式:
  1. style = xlwt.easyxf(num_format_str='D-MMM-YY')
  2. ws.write(1, 0, datetime.now(), style)
复制代码
具体细节及更多功能这里不展开说明。



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

RTFM、STFW

:)



参考资料:



回复

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

沙发
发表于 2018-12-4 16:41:41 |只看该作者
学习了一些,去官网看手册去了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 09:30 , Processed in 0.022864 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部