目录
一、介绍excel
二、应用场景:----可以完成什么操作
生活中遇见的场景
三、下载
四、excel模块
3.1、xlrd
语法:
案例: 算2020年与2021收入差距是多少
3.2、openpyxl
语法
案例1:计算一年的工资--12个月
案例2:新建sheet页,添加数据
效果:
案例3:九九乘法表
3.3、两个模块的区别
五、生成器
六、案例
抓取链家的长沙市所有房价,放到excel文档中,爬了一页
代码演示:
最后效果:
七、思维导图总结
一、介绍excel
Excel是一种电子表格软件,由微软公司开发和发布。它是一种用于数据分析、计算和管理的工具,可以用于创建、编辑和组织数据表格,进行数据分析和图表制作等。Excel具有强大的计算功能和丰富的数据处理功能,被广泛应用于商业、金融、教育、科研等领域。Excel的文件格式为.xlsx,它可以在Windows、Mac和其他操作系统上运行。
excel有不同的sheet页,每个sheet页,也有不同的内容 先获得对应的sheet页
二、应用场景:----可以完成什么操作
1. 数据处理和分析:将数据从数据库或其他数据源中提取出来,然后用Python写入到Excel文件中,以便进行进一步的数据处理和分析。
2. 数据报告和可视化:将数据以图表、表格等形式写入Excel文件,以便生成数据报告和可视化分析结果。
3. 自动化报表生成:通过Python编写程序,自动从数据源中提取数据,并将其写入Excel文件,以生成定期报表。
4. 数据导出:将Python程序处理后的数据导出到Excel文件中,以便与其他人分享或进行进一步处理。
5. 数据备份:将Python程序处理后的数据写入Excel文件,以便进行数据备份和存档。
生活中遇见的场景
①把mysql数据导入到excel文件中,然后报错了导出来日期类型是反着的,格式对不上
列:MySQL的格式:2023/12/12 excel:12/12/2023
解决办法:写个pythin脚本改变它
把文件读出来放到页面上去,通过集合去调用一遍
②准备一个excel文件通过python程序去读取excel文件内容
通过selenium打开网站过selenium方法,往输入框中填入对应的内容,然后会控制它去点击,点击提交
三、下载
注:excel不是python自带的,要求下载
pip install xlrdpip install openpyxl
四、excel模块
3.1、xlrd
用于从Excel文件中读取数据,支持读取旧版本的Excel文件(xls格式),但不支持写入或修改Excel文件。xlrd可以用于读取Excel文件中的单元格数据、格式、公式等内容。
语法:
导入以有模块
from xlrd import open_workbook
打开文件wb=open_workbook('hh.xlsx')
根据名字拿
s1=wb.sheet_by_name('2020')
拿列 从0开始
s1.col_values(1)
案例: 算2020年与2021收入差距是多少
from xlrd import open_workbook# 打开文件
wb=open_workbook('hh.xlsx')# 根据名字拿
s1=wb.sheet_by_name('2020')# 算出总数
# sum(s1.col_values(1))# 从0开始 拿第二列
print([c for c in s1.col_values(1)])# 2020年收入
s1=wb.sheet_by_name('2020')
t1=sum(s1.col_values(1))# 2021年收入
s2=wb.sheet_by_name('2020')
t2=sum(s2.col_values(1))print(t2-t1)
注意: 版本必须是1.2以下的
3.2、openpyxl
语法
导入模块
from openpyxl import load_workbook
读取以有文档
load_workbook('放你要读取的文档')
wb就是一个工作表(拿到整文档)
wb = load_workbook('hh.xlsx');
获取默认的那个sheet页
s1=wb.active
切换sheet页#s2=wb['放sheet页名字'] s2=wb['2020']
新建一个sheet页wb.create_sheet(title='')
获取所有sheet页 方法一:wb.sheetnames
方法二:for sheet in wb:print(sheet.title)
获得sheet页的名字.title
单独只定某个格子 F4列
方式一:wb['F4']=内容
方式二: 获取单元格col\row列和行ws3.cell(colum=col,row=row,value="")
切片方式可以访问多个单元格--用名字cell_range=ws['A1':'C2']
读多个格子iter_row---用区域来读 注:从1开始读取到3列,读取到第2行for row in ws.iter_row(min_row=1,max_col=3,max_row=2):for cell in row:print(cell)
获取所有行---每一行都是元组,里面有很多单元格ws.rows
获取所有列ws.columns
ws3 ['AA10'].value
注:不好调
案例1:计算一年的工资--12个月
方法一:
wb = load_workbook('hh.xlsx');
# 选中sheet页
s1 = wb['2020']total = 0
# 拿到需要的数据 拿12行
for i in range(1, 13):# 通过列方法拿 拿到工资数字在第二行# 测试一下# print(s1.cell(row=i,column=2).value)# 每进来一次total += s1.cell(row=i, column=2).valueprint(total)
#最后保存就可以了
方法二
wb = load_workbook('hh.xlsx');
# 选中sheet页
s1 = wb['2020']# 获取第二行---遍历当前列
cs=s1.iter_cols(min_row=1,max_row=12,min_cil=2,max_col=2)# 方式二列表推导式
cs=[c for c in cs ][0]
# 拿到所有值
cs=[c.value for c in cs]
# 求和并保存就可以了
print(sum(cs))# 方式一遍历
# for c in cs:
# for c in c:
案例2:新建sheet页,添加数据
# 导入
from openpyxl import load_workbook
wb = load_workbook('hh.xlsx');
s3 = wb.active
s3 = wb.create_sheet(title='2023')
# 遍历
for i in range(10):# append添加内容s3.append(range(5))# 保存
wb.save('demo.xlsx')
效果:
案例3:九九乘法表
注:#新建sheet页,但新建出来必定有不用新建,只需要拿当前sheet页
# 导入
from openpyxl import Workbook# 新建
wb = Workbook()# 获取默认sheet页
s1 = wb.active# 改个名字
s1 = title = '九九乘法表'
# 放内容--->循环
for i in range(1, 10):for j in range(1, i+1):# 拿到单元格s1.cell(row=i,column=j,value=f'{i}*{j}={i*j}')wb.save('99.xlsx')
效果:
用于读取、写入和修改Excel文件,支持读取和写入新版本的Excel文件(xlsx格式)。openpyxl可以用于创建新的Excel文件、读取和修改现有文件中的数据、样式、图表等内容。
3.3、两个模块的区别
①1.2.0之后的版本不支持xlsx格式,openpyxl都支持
②xlrd只读取,openpyxl可以读取也可以新建修改
③读取速度比较:xlrd比openpyxl快
④ 老版新建出来教工作表,新版新建出来叫工作簿
格式:xls(老版的) xlsx(新版的---2013后面)
问题:为什么xlrd不支持新版的xlsx格式,而支持xls老版的?
回答:xlrd是一个Python模块,用于从Excel文件中读取数据。它最初是为了处理旧版本的Excel文件(xls格式)而设计的,因为在xlrd被开发的时候,xlsx格式还没有成为主流。xls格式是二进制格式,而xlsx格式是基于XML的开放格式。
当xlsx格式成为主流并且对其读取需求增加时,openpyxl模块应运而生,提供了对新版本Excel文件的读取、写入和修改功能。因此,虽然xlrd不支持新版的xlsx格式,但可以使用openpyxl模块来满足对新版本Excel文件的处理需求。
总的来说,xlrd不支持新版的xlsx格式是因为它最初设计时的用途是处理旧版本的Excel文件,而openpyxl则专门用于处理新版本的Excel文件。
五、生成器
简介:生成器(generator)是一种特殊的迭代器,它可以在迭代过程中动态生成值,而不需要一次性将所有值存储在内存中。生成器使用 yield 关键字来返回值,并且可以暂停和继续执行,这使得它们非常灵活和高效。生成器可以通过 for 循环来迭代,也可以使用 next() 函数来逐个获取值。生成器可以大大节省内存空间,特别适用于处理大数据集或者需要动态生成值的情况。注: 生成器不能中括号,只能遍历
六、案例
抓取链家的长沙市所有房价,放到excel文档中,爬了一页
注: for i in names:这个遍历的是元素 --->是没有下标的---->所有用生成器enumerate
房价的名字:
房价的价格:
代码演示:
from requests_html import HTMLSession
from openpyxl import Workbook# 发请求的对象
session=HTMLSession();# 拿到响应码
resp=session.get('https://cs.fang.lianjia.com/loupan/')# 拿到对应网站
html=resp.html# 如果是异步请求,要渲染---但是下面有下一页会报错
# html.render()# 测试是否拿到数据
# print(html.text)# 拿到房子的名字和价格
names=[t.text for t in html.find(".resblock-name .name")]
# print([t.text for t in html.find(".resblock-name .name")])prices=[t.text for t in html.find(".main-price .number")]
# print([t.text for t in html.find(".main-price .number")])# 新建excel
wb=Workbook()# 拿到默认的工作页
s1=wb.active# 遍历
for i,v in enumerate(names):# 写入 i下标 v内容# 名字 i+1因为从1开始s1.cell(row=i+1,column=1,value=v)# 价格s1.cell(row=i+1,column=2,value=prices[i])#保存
wb.save('lj.xlsx')
出现的报错:网络超时,重新运行就好
最后效果:
七、思维导图总结