Python与Excel 不得不说的事情
数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道。
如果仅仅是要以表单形式保存数据,可以借助 CSV 格式(一种以逗号分隔的表格数据格式)进行处理,Excel 也支持此格式。但标准的 Excel 文件(xls/xlsx)具有较复杂的格式,并不方便像普通文本文件一样直接进行读写,需要借助第三方库来实现。
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/d894f66130df4530d9e1ccb164fd116c.jpeg)
常用的库是 python-excel 系列:
- xlrd、xlwt、xlutils
- xlrd - 读取 Excel 文件
- xlwt - 写入 Excel 文件
- xlutils - 操作 Excel 文件的实用工具,如复制、分割、筛选等
尽管这是目前被用得最多的 Excel 库,我还是很想吐槽为什么这三个包不能放在一个模块里……另外它们有个缺陷,就是只能处理 xls 文件。如果你想用新版本的 xlsx,可以考虑 openpyxl 和 xlsxwriter。
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/b9d72619dac6ca0c078254da4e6d62c0.jpeg)
不过今天只说说这三个。
安装
安装的方法没啥特别的,只是得装三遍。可以下载安装包、下载代码压缩包、或者通过 pip 等。
如果安装过之前推荐的 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)
测试文件:
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/be675e355eba0f1d9fd2add81611f5a3.jpeg)
输出结果:
- 表单数量: 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')
生成文件:
![Python与Excel 不得不说的事情](https://s3.51cto.com/oss/201912/24/b1f08e87e3852ca747955156ef78147f.jpeg)
常用的方法:
- 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')
修改后文件:
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/12ce87eb858a1debd8e3b6efa87fb26c.jpeg)
特别要注意的是,选取读取表单时,要使用 sheet_by_index,而在选取写入表单时,则要用 get_sheet。不要问我为什么,我也很想知道这么设定的用意何在……
时间转换
如果表单中有时间格式的数据,通过处理之后,你会发现时间数据出了差错。
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/93a278ecd9524b7f23034f40a79f5358.jpeg)
![Python与Excel 不得不说的事情](https://s1.51cto.com/oss/201912/24/38ef08772354eae1254302492a9970c9.jpeg)
输出单元格内容:
- [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
- :)
相关文章
- 图像处理工具Python扩展库,你了解吗?
- 十个常用的损失函数解释以及Python代码实现
- 30 个数据科学工作中必备的 Python 包
- 如何在 Windows 上安装 Python
- 几行 Python 代码就可以提取数百个时间序列特征
- 使用Python快速搭建接口自动化测试脚本实战总结
- 哪种编程语言最适合开发网页抓取工具?
- 不要在 Python 中使用循环,这些方法其实更棒!
- 震惊!用Python探索《红楼梦》的人物关系!
- 如何最简单、通俗地理解Python模块?
- 酷炫,Python实现交通数据可视化!
- 为什么急于寻找Python的替代者?
- 30 个数据工程必备的Python 包
- 去字节面试被面这题能答上来吗?谈谈你对时间轮的理解?
- 火山引擎在行为分析场景下的 ClickHouse JOIN 优化
- 用Python爬取了某宝1166家月饼数据进行可视化分析,终于找到最好吃的月饼~
- 在 Linux 上试试这个基于 Python 的文件管理器
- Python列表解析式到底该怎么用?
- 如何快速把你的 Python 代码变为 API
- 十个Python初学者常犯的错误