用Python处理Excel表格

用Python处理Excel表格,第1张

Excel是Windows环境下流行而强大的电子表格程序。


openpyxl模块可以让Python程序能读取和修改Excel表格文件。


例如,你可能有一个无聊的任务,需要从一个表格中复制一些数据,粘贴到另一个表格中。


或者可能需要从几千行中挑选出几行,并根据某个条件稍作修改。


或者需要查看几百份部门预算电子表格,找到其中的赤字。


这些无聊的任务都可以用Python完成。


Excel文档

一个Excel电子表格文件称为一个工作簿。


一个工作簿保存在扩展名为.xlsx的文件中。


每个工作簿可以包含多个表(也称为工作表)。


用户当前查看的表(或关闭Excel前最后查看的表)称为活动表。


每个表都有一些列(地址是从A开始的字母)和一些行(地址是从1开始的数字)。


在特定行和列的翻个称为单元格。


每个单元格都包含一个数字或文本值。


单元格形成的网格和数据构成了表。


安装openpyxl模块

Python没有自带openpyxl,所以必须自己安装。


打开命令行输入

pip install openpyxl

即可安装。


读取Excel文档

我们将使用名为example.xlsx的电子表格,可以在Automate the Boring Stuff with Python处找到并下载。


如下图所示,有3个默认的表,名为Sheet1、Sheet2和Sheet3,这是Excel自动为新工作簿提供的(不同 *** 作系统和电子表格程序,提供的默认表个数可能会不同)。


用openpyxl模块打开Excel文档

导入openpyxl模块后,就可以用openpyxl.load_workbook()函数打开Excel文档。


openpyxl.load_workbook()函数接受文件名,返回一个workbook数据类型的值。


这个workbook对象代表整个Excel文件(example.xlsx),类似File对象代表一个打开的文本文件。


从工作簿中取得工作表

通过workbook对象的sheetnames属性可以得到工作簿中所有表名的列表。


每个表由一个Worksheet对象表示,可以通过向工作簿进行索引(用表名字符串)获得。


可以通过Workbook对象的active属性取得工作簿的活动表。


在取得Worksheet对象后,可以通过title属性取得它的名称。


从表中取得单元格

获取到了Worksheet对象后,就可以按名字访问Cell对象。


Cell对象由一个value属性,它包含这个单元格中保存的值。


Cell对象也有row、column和coordinate属性,提供该单元格的位置信息。


如上图所示,访问单元格B1的Cell对象的value属性,得到字符串'Apples'。


row属性给出的是整数1,column属性给出的是2,coordinate属性给出的是'B1'。


调用表的cell()方法时,可以传入整数作为row和column关键字参数,也可以得到一个单元格。


可以通过Worksheet对象的max_column和max_row属性,确定表的大小。


sheet.max_column, sheet.max_row
# (3, 7)
列字母和数字之间的转换

要从字母转换到数字,就调用openpyxl.utils.column_index_from_string函数。


要从数字转换到字母,就调用openpyxl.utils.get_column_letter()函数。


从openpyxl.utils模块引入这两个函数后,可以调用get_column_letter(),传入像27这样的整数,弄清楚第27列的字母是什么。


函数column_index_string做的事情相反:传入一列的字母名称,它返回该列的数字是什么。


从表中取得行和列

可以将Worksheet对象切片,取到电子表格中一行、一列或一个矩形区域中的所有Cell对象。


然后可以循环遍历这个切片中的所有单元格。


这个元组包含3个元组:每个元组代表1行,从指定区域的顶部到底部。


这3个内部元组中的每一个包含指定区域中一行的Cell对象,从最左边的单元格到最右边。


工作表的这个切片包含了从A1到C3区域的所有Cell对象,从左上角的单元格到右下角的单元格。


可以按照如下方式获取到表格中的一行或一列

写入Excel文档

openpyxl也提供了一些方法写入数据。


这意味着你的程序可以创建和编辑电子表格文件。


利用Python,创建一个包含几千行数据的电子表格是非常简单的。


创建并保存Excel文档

调用openpyxl.Workbook()函数,创建一个新的空Workbook对象。


当修改Workbook对象或它的工作表和单元格时,电子表格文件不会保存,除非调用save()工作簿方法。


wb.save('demo.xlsx')

创建和删除工作表

利用create_sheet()remove_sheet()方法,可以在工作簿中添加或删除工作表。


create_sheet()方法返回一个新的Worksheet对象,名为SheetX,它默认是工作簿的最后一个工作表。


或者,可以利用index和title关键字参数,指定新工作表的索引或名称。


remove()方法接受一个Worksheet对象作为其参数,而不是工作表名称的字符串。


将值写入单元格

将值写入单元格很像将值写入字典中的键。


查看demo.xlsx文件,可以看到值已被写入到文件中

项目:从电子表格中读取数据

假设你有一张电子表格,里面包含了2010年美国人口普查数据。


你有一个比较无聊的任务,要遍历表中的几千行,计算总的人口,以及每个县的普查区数目(普查区是一个地理区域,为了人口普查而定义的)。


表格中的每一行表示一个人口普查区。


表格名为censupopdata.xlsx,可以在Automate the Boring Stuff with Python处下载。


censuspopdata.xlsx电子表格中只有一张表,名为“Population by Census Tract”。


每一行都保存了一个普查区的数据。


列分别是普查区的编号(A),州的简称(B),县的名称(C),普查区的人口(D)。


在这个项目中,我们需要编写一个脚本,从人口普查电子表格中读取数据,并做以下几件事:

  • 从Excel表格中读取数据
  • 计算每个县中普查区的数目
  • 计算每个县的总人口
  • 打印结果

这意味着代码需要完成下列任务:

  • 用openpyxl模块打开Excel文档并读取单元格
  • 计算所有普查区和人口数据,将它们保存到一个数据结构中
  • 利用pprint模块,将该数据结构写入一个扩展名为.py的文本文件中

完整代码如下所示:

import openpyxl, pprint

# 用openpyxl模块打开Excel文档
wb = openpyxl.load_workbook('censuspopdata.xlsx')
sheet = wb['Population by Census Tract']
# 存储普查区数目和人口数据
countryData = {}

for row in range(2,sheet.max_row+1):
    state = sheet['B'+str(row)].value
    country = sheet['C'+str(row)].value
    pop = sheet['D'+str(row)].value

    countryData.setdefault(state, {})

    countryData[state].setdefault(country, {'tracts':0, 'pop':0})

    countryData[state][country]['tracts'] += 1
    countryData[state][country]['pop'] += int(pop)

# 将数据存储到文件中
resultFile = open('census2010.py', 'w')
resultFile.write('allData = ' + pprint.pformat(countryData))
resultFile.close()

保存到census2010.py文件中的数据如下所示:

参考 

Automate the Boring Stuff with Python

如果大家在刚开始学习中遇到困难,想找一个python学习交流环境,可以加入我们,领取学习资料,一起讨论

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/570986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存