Excel表格数据的读写

浏览 1495

课文

在数据处理中,我们经常要面对 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 类似。

有的时候我们需要获取指定行或列的内容,方括号索引或许能帮到我们。

image

经常编辑 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 # 注意字母应在数字之前
'四季皆你'

对表格的写入

对于表格的创建我们只需记住几个关键步骤。

  1. 创建 Workbook 工作簿
  2. 创建 sheet 表
  3. 增添数据
  4. 保存文件

我们用一小段代码来演示一下。

# 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')

评论

登录参与讨论

暂无评论

共 0 条
  • 1
前往
  • 1