使用 Python 读写 Excel 文件(一)
项目要求如果说是 Office 办公软件使得 Windows 成为主流的操作系统,那么 Excel 就是使得微软硬起来的法宝!
Word 和 PowerPoint 都有不相上下的对手,但 Excel 几乎是无法被取代的,因为这玩意儿确实太逆天了,它甚至让一向自命不凡的苹果用户都纷纷拜倒。
有人说 “对职场人而言,掌握 Excel,其实是在解放自己;对企业家而言,了解 Excel,其实是在赢得先机。
没错,Excel 就是这么吊。
作为程序猿,我们也离不开 Excel。
从网页爬下来的海量数据可以用 Excel 清洗过滤,成堆的实验数据也可以用 Excel 进行分析……
当然,大家不要想歪了,咱今天的课程不是教大家 Excel 怎么玩?
而是讲如何使用 Python 来操作 Excel!
要求:使用 python 读写 Excel 文件。
开发思路
得益于前人的辛勤劳作,Python 处理 Excel 已有很多现成的 “轮子”
openpyxl 模块的使用。关于这个模块的详细用法,大家可以参考 ->openpyxl 模块中文文档
openpyxl 模块简单易用、功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等功能应有尽有,图表功能是其一大亮点。
思路一:安装 openpyxl 模块
打开 cmd 命令行窗口,输入pip install openpyxl命令即可 “一键安装”:
注:如果当前环境下安装有多个版本的 Python,请确保 pip 命令对应的 Python 版本(参见 ->如何让多个版本的 Python 和谐共处)
打开 IDLE,执行import openpyxl语句,如果没有报错,那就说明成功安装啦:
思路二:创建并保存 Excel 文件
调用 openpyxl.Workbook() 生成一个 Workbook 的实例化对象,这个就代表一个工作簿(就是一个 Excel 文件):
import openpyxl
wb = openpyxl.Workbook()
# 获取活跃的工作表
ws = wb.active
# 数据可以直接赋值给单元格
ws['A1'] = 520
# 可以整行添加
ws.append()
# Python 类型将自动转换
import datetime
ws['A3'] = datetime.datetime.now()
# 保存文件
wb.save("demo.xlsx")
上面代码依次敲完之后,我们可以在 IDLE 所在的文件夹中找到一个叫做 “demo.xlsx” 的 Excel 文件。
打开之后内容如下:
思路三:将豆瓣 TOP250 电影排行榜保存为 Excel 文件
《豆瓣TOP250电影排行榜》文本文件:
这也没什么问题,但如果现在要你从这 250 部电影中按评分进行排序,那估计又是一场头脑风暴了……
虽然用 Python 可以实现,但在 Excel 上就是点几下鼠标的操作
import requests
import bs4
import re
import openpyxl
def open_url(url):
# 使用代{过}{滤}理
# proxies = {"http": "127.0.0.1:1080", "https": "127.0.0.1:1080"}
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
# res = requests.get(url, headers=headers, proxies=proxies)
res = requests.get(url, headers=headers)
return res
def find_movies(res):
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# 电影名
movies = []
targets = soup.find_all("div", class_="hd")
for each in targets:
movies.append(each.a.span.text)
# 评分
ranks = []
targets = soup.find_all("span", class_="rating_num")
for each in targets:
ranks.append(each.text)
# 资料
messages = []
targets = soup.find_all("div", class_="bd")
for each in targets:
try:
messages.append(each.p.text.split('\n').strip() + each.p.text.split('\n').strip())
except:
continue
result = []
length = len(movies)
for i in range(length):
result.append(, ranks, messages])
return result
# 找出一共有多少个页面
def find_depth(res):
soup = bs4.BeautifulSoup(res.text, 'html.parser')
depth = soup.find('span', class_='next').previous_sibling.previous_sibling.text
return int(depth)
def save_to_excel(result):
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = "电影名称"
ws['B1'] = "评分"
ws['C1'] = "资料"
for each in result:
ws.append(each)
wb.save("豆瓣TOP250电影.xlsx")
def main():
host = "https://movie.douban.com/top250"
res = open_url(host)
depth = find_depth(res)
result = []
for i in range(depth):
url = host + '/?start=' + str(25 * i)
res = open_url(url)
result.extend(find_movies(res))
'''
with open("test.txt", "w", encoding="utf-8") as f:
for each in result:
f.write(each)
'''
save_to_excel(result)
if __name__ == "__main__":
main()
程序实现如下:
如果现在要你从这 250 部电影中按评分进行排序,应该如何做呢?
附件: 多多评分,刷起你们手中鲜花 学习了,多谢多谢 等明年我学完Py告诉你 感谢分享 正在入门中 学习 人生苦短,我用Python 为什么不先排序后写入? 感谢分享教程 # 将查到的结果添加到简介的列表
for each in targets:
try:
messages.append(each.p.text.split('\n').strip() + each.p.text.split('\n').strip())
except:
continue
请问这里为什么用try,而不是直接写入呢,有点不明白,求教~ result.extend(find_movies(res)) # 以搜索结果扩充列表result
'''
with open("test.txt", "w", encoding="utf-8") as f:
for each in result:
f.write(each)
'''
去掉这部分会对程序有什么影响呢?