Excel表格数据的读写

浏览 621

课文

在数据处理中,我们经常要面对 `excel` 表格的数据。 不管是政府的统计数据, 还是各种机构的数据,很多时候他们是由基层员工手动录制的。这也就导致了很多是 `excel格式` 。 对于这类格式我们采用 `openpyxl` 这个第三方库,原因在于 `openpyxl` 是维护最积极,使用最多的库。 首先是 `openpyxl` 的安装。 ```python pip install openpyxl ``` *openpyxl不支持2010年以前的excel文件格式,如有需要可用xlrd、xlwd这两个库* [点此打开本文示例文件](https://pan.baidu.com/s/11S129R2Rw_Yhx3b8FsPTIg),提取码:3yya。 ## 对表格的读取 使用B站电竞视频情况作为数据源。 *数据来源镝数聚* 首先尝试着打印所有的 sheet 名 ```python import openpyxl workbook = openpyxl.load_workbook(filename = '截至2020年12月16日B站电竞行业播放数前100位的视频情况.xlsx') workbook.sheetnames # 获取所有的sheet名 ``` ```output ['数据'] ``` 在这个 excel 文件中我们只有名为`数据`的一张表,通过方括号索引便可以拿到这张表。 ```python workbook['数据'] ``` ```output <Worksheet "数据"> ``` 使用变量 `sheet` 来保存获取到的表对象,接着通过 `rows` 属性获取到表对象的所有列。 ```python sheet = workbook['数据'] sheet.rows ``` ```output <generator object Worksheet._cells_by_row at 0x0000019191D24740> ``` 当我们打印表格的 `rows` 属性时,发现返回的是一个生成器对象。对于生成器可以通过 `list` 方法将其转成列表再进行操作。 我们也可以不转成列表,而是直接用 for 循环对每行的数据进行读取,打印其中每个单元格的值。 ```python 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) ) ``` 如此便可打印表格中的数据 ```output 视频名称:视频名称,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 属性。 ```python 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]) ) ``` ```output 视频名称: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](https://qiniu.3yya.com/95f7a5cd1e74c99f6e13db2c565acedd/95f7a5cd1e74c99f6e13db2c565acedd.png) 经常编辑 excel 的应该清楚,通常是使用字母来表示列,数字来表示行。如果我们想拿第一列的数据,写法应该是 `sheet['A']`。 ```python for cell in sheet['A']: print(cell.value) ``` ```output 视频名称 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]。 ```python for cell in sheet[2]: print(cell.value) ``` ```output Lying man第二季 小辉辉特困生 3547000 266000 2015-11-09 ``` 如果我们只想获取单个单元格的数据,比如说第三行第二列则是 sheet['B3']。 ```python sheet['B3'].value # 注意字母应在数字之前 ``` ```output '四季皆你' ``` ## 对表格的写入 对于表格的创建我们只需记住几个关键步骤。 1. 创建 Workbook 工作簿 2. 创建 sheet 表 3. 增添数据 4. 保存文件 我们用一小段代码来演示一下。 ```python # 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