Excel表格数据的读写
浏览 1439
课文
在数据处理中,我们经常要面对 excel
表格的数据。
不管是政府的统计数据, 还是各种机构的数据,很多时候他们是由基层员工手动录制的。这也就导致了很多是 excel格式
。
对于这类格式我们采用 openpyxl
这个第三方库,原因在于 openpyxl
是维护最积极,使用最多的库。
首先是 openpyxl
的安装。
pip install openpyxl
openpyxl不支持2010年以前的excel文件格式,如有需要可用xlrd、xlwd这两个库
点此打开本文示例文件,提取码:3yya。
对表格的读取
使用B站电竞视频情况作为数据源。
数据来源镝数聚
首先尝试着打印所有的 sheet 名
import openpyxl
workbook = openpyxl.load_workbook(filename = '截至2020年12月16日B站电竞行业播放数前100位的视频情况.xlsx')
workbook.sheetnames # 获取所有的sheet名
['数据']
在这个 excel 文件中我们只有名为数据
的一张表,通过方括号索引便可以拿到这张表。
workbook['数据']
<Worksheet "数据">
使用变量 sheet
来保存获取到的表对象,接着通过 rows
属性获取到表对象的所有列。
sheet = workbook['数据']
sheet.rows
<generator object Worksheet._cells_by_row at 0x0000019191D24740>
当我们打印表格的 rows
属性时,发现返回的是一个生成器对象。对于生成器可以通过 list
方法将其转成列表再进行操作。
我们也可以不转成列表,而是直接用 for 循环对每行的数据进行读取,打印其中每个单元格的值。
for row in sheet.rows:
print(
"视频名称:%s,UP主:%s,播放量:%s,弹幕数:%s,投稿时间:%s"
% (row[0].value, row[1].value, row[2].value, row[3].value, row[4].value)
)
如此便可打印表格中的数据
视频名称:视频名称,UP主:UP主,播放量:播放量(次),弹幕数:弹幕数(个),投稿时间:投稿日期
视频名称:Lying man第二季,UP主:小辉辉特困生,播放量:3547000,弹幕数:266000,投稿时间:2015-11-09
视频名称:卢本伟White五五开的生化危机7 的墨迹之旅,UP主:四季皆你,播放量:2957000,弹幕数:133000,投稿时间:2017-01-28
视频名称:大家好,我是EDG.Clearlove,今天我入驻B站辣!,UP主:EDG_Clearlove,播放量:3297000,弹幕数:95000,投稿时间:2020-07-09
视频名称:【全程高燃/催泪】自备纸巾,10分钟带你回顾LPL七年之梦,S2-S8主题曲混剪,UP主:靠谱电竞,播放量:3438000,弹幕数:67000,投稿时间:2018-11-16
视频名称:【暴走大事件 第七季】01红 全新大事件如7而至,王尼玛携手神秘嘉宾燃爆全场,UP主:暴走漫画,播放量:3391000,弹幕数:61000,投稿时间:2020-10-23
视频名称:Uzi | 大家好,我是你们的枣子哥简自豪,今天正式入驻B站啦!,UP主:Uzi,播放量:10536000,弹幕数:46000,投稿时间:2020-06-05
视频名称:电竞运动员Uzi退役独家专访:如果时间还够,很多东西我可以做到,UP主:小央视频,播放量:3731000,弹幕数:44000,投稿时间:2020-06-03
视频名称:主播真会玩鬼畜篇05:染发美颜P图,看我五五开!,UP主:是大腿,播放量:4771000,弹幕数:38000,投稿时间:2016-11-11
......
我们会发现把表头也一并打印出来了,而我们的本意应该是跳过表头的。
使用 iter_rows
来代替 rows, iter_rows
接收以下几个参数:
- min_col (int) – 最小的列(从1开始)。
- min_row (int) – 最小的行(从1开始)。
- max_col (int) –最大的列(从1开始)。
- max_row (int) – 最大的行(从1开始)。
- values_only (bool) – 是否返回 cell(单元格) 的值,默认值为 False。(True 时相当于返回 cell.value,False 时相当于返回 cell)。
对比之前的代码,我们通过指定 min_row 跳过了表头,使得打印结果中不再包含表头的数据。还通过设置 values_only 为 True, 直接返回了每一个 cell 的 value, 从而在打印数据时不再需要使用 value 属性。
for row in sheet.iter_rows(min_row=2, values_only=True):
print(
"视频名称:%s,UP主:%s,播放量:%s,弹幕数:%s,投稿时间:%s"
% (row[0], row[1], row[2], row[3], row[4])
)
视频名称:Lying man第二季,UP主:小辉辉特困生,播放量:3547000,弹幕数:266000,投稿时间:2015-11-09
视频名称:卢本伟White五五开的生化危机7 的墨迹之旅,UP主:四季皆你,播放量:2957000,弹幕数:133000,投稿时间:2017-01-28
视频名称:大家好,我是EDG.Clearlove,今天我入驻B站辣!,UP主:EDG_Clearlove,播放量:3297000,弹幕数:95000,投稿时间:2020-07-09
视频名称:【全程高燃/催泪】自备纸巾,10分钟带你回顾LPL七年之梦,S2-S8主题曲混剪,UP主:靠谱电竞,播放量:3438000,弹幕数:67000,投稿时间:2018-11-16
视频名称:【暴走大事件 第七季】01红 全新大事件如7而至,王尼玛携手神秘嘉宾燃爆全场,UP主:暴走漫画,播放量:3391000,弹幕数:61000,投稿时间:2020-10-23
视频名称:Uzi | 大家好,我是你们的枣子哥简自豪,今天正式入驻B站啦!,UP主:Uzi,播放量:10536000,弹幕数:46000,投稿时间:2020-06-05
......
同理我们也可以通过 sheet.columns
来获取每一列的数据,还有 iter_cols
方法让我们获取指定范围内的内容,具体参数与 iter_rows
类似。
有的时候我们需要获取指定行或列的内容,方括号索引或许能帮到我们。
经常编辑 excel 的应该清楚,通常是使用字母来表示列,数字来表示行。如果我们想拿第一列的数据,写法应该是 sheet['A']
。
for cell in sheet['A']:
print(cell.value)
视频名称
Lying man第二季
卢本伟White五五开的生化危机7 的墨迹之旅
大家好,我是EDG.Clearlove,今天我入驻B站辣!
【全程高燃/催泪】自备纸巾,10分钟带你回顾LPL七年之梦,S2-S8主题曲混剪
【暴走大事件 第七季】01红 全新大事件如7而至,王尼玛携手神秘嘉宾燃爆全场
Uzi | 大家好,我是你们的枣子哥简自豪,今天正式入驻B站啦!
电竞运动员Uzi退役独家专访:如果时间还够,很多东西我可以做到
主播真会玩鬼畜篇05:染发美颜P图,看我五五开!
靠谱盘点97:气急败坏!TES让二追三破防欧洲解说:阿水!我恨你!
靠谱盘点89:姜成鹿的快乐!Theshy玩新英雄莉莉娅嘴都笑歪了!
靠谱盘点91:Faker被最强新人顶替,饮水机坐穿,金教练的话太扎心!
......
同理,拿第二行的数据写法就是 sheet[2]。
for cell in sheet[2]:
print(cell.value)
Lying man第二季
小辉辉特困生
3547000
266000
2015-11-09
如果我们只想获取单个单元格的数据,比如说第三行第二列则是 sheet['B3']。
sheet['B3'].value # 注意字母应在数字之前
'四季皆你'
对表格的写入
对于表格的创建我们只需记住几个关键步骤。
- 创建 Workbook 工作簿
- 创建 sheet 表
- 增添数据
- 保存文件
我们用一小段代码来演示一下。
# 1.创建 Workbook 工作簿
workbook = Workbook()
# 2.创建 sheet 表
sheet = workbook.active
sheet.title = "雇员"
# 3.增添数据
sheet.append(['姓名', '年龄', '职业'])
sheet.append(['小明', 20, '大学生'])
sheet.append(['鸣人', 22, '火影'])
sheet.append(['柯南', 10, '小学生'])
# 4.保存文件
workbook.save(filename = 'employees.xlsx')
评论
暂无评论