吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10870|回复: 43
收起左侧

[Python 转载] 使用 Python 读写 Excel 文件(一)

[复制链接]
程语欣 发表于 2018-1-30 00:31
项目要求
如果说是 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命令即可 “一键安装”:

12.png

注:如果当前环境下安装有多个版本的 Python,请确保 pip 命令对应的 Python 版本(参见 ->如何让多个版本的 Python 和谐共处)

打开 IDLE,执行import openpyxl语句,如果没有报错,那就说明成功安装啦:

13.png

思路二:创建并保存 Excel 文件

调用 openpyxl.Workbook() 生成一个 Workbook 的实例化对象,这个就代表一个工作簿(就是一个 Excel 文件):
[Python] 纯文本查看 复制代码
import openpyxl
 
wb = openpyxl.Workbook()
 
# 获取活跃的工作表
ws = wb.active
 
# 数据可以直接赋值给单元格
ws['A1'] = 520
 
# 可以整行添加
ws.append([1, 2, 3])
 
# Python 类型将自动转换
import datetime
ws['A3'] = datetime.datetime.now()
 
# 保存文件
wb.save("demo.xlsx")


上面代码依次敲完之后,我们可以在 IDLE 所在的文件夹中找到一个叫做 “demo.xlsx” 的 Excel 文件。

打开之后内容如下:

14.png


思路三:将豆瓣 TOP250 电影排行榜保存为 Excel 文件
《豆瓣TOP250电影排行榜》文本文件:



这也没什么问题,但如果现在要你从这 250 部电影中按评分进行排序,那估计又是一场头脑风暴了……

虽然用 Python 可以实现,但在 Excel 上就是点几下鼠标的操作

[Python] 纯文本查看 复制代码
import requests[/font]
[font=宋体]import bs4[/font]
[font=宋体]import re[/font]
[font=宋体]import openpyxl[/font]
 
[font=宋体]def open_url(url):[/font]
[font=宋体]    # 使用代{过}{滤}理[/font]
[font=宋体]    # proxies = {"http": "127.0.0.1:1080", "https": "127.0.0.1:1080"}[/font]
[font=宋体]    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'}[/font]
 
[font=宋体]    # res = requests.get(url, headers=headers, proxies=proxies)[/font]
[font=宋体]    res = requests.get(url, headers=headers)[/font]
 
[font=宋体]    return res[/font]
 
[font=宋体]def find_movies(res):[/font]
[font=宋体]    soup = bs4.BeautifulSoup(res.text, 'html.parser')[/font]
 
[font=宋体]    # 电影名[/font]
[font=宋体]    movies = [][/font]
[font=宋体]    targets = soup.find_all("div", class_="hd")[/font]
[font=宋体]    for each in targets:[/font]
[font=宋体]        movies.append(each.a.span.text)[/font]
 
[font=宋体]    # 评分[/font]
[font=宋体]    ranks = [][/font]
[font=宋体]    targets = soup.find_all("span", class_="rating_num")[/font]
[font=宋体]    for each in targets:[/font]
[font=宋体]        ranks.append(each.text)[/font]
 
[font=宋体]    # 资料[/font]
[font=宋体]    messages = [][/font]
[font=宋体]    targets = soup.find_all("div", class_="bd")[/font]
[font=宋体]    for each in targets:[/font]
[font=宋体]        try:[/font]
[font=宋体]            messages.append(each.p.text.split('\n')[1].strip() + each.p.text.split('\n')[2].strip())[/font]
[font=宋体]        except:[/font]
[font=宋体]            continue[/font]
 
[font=宋体]    result = [][/font]
[font=宋体]    length = len(movies)[/font]
[font=宋体]    for i in range(length):[/font]
[font=宋体]        result.append([movies[i], ranks[i], messages[i]])[/font]
 
[font=宋体]    return result[/font]
 
[font=宋体]# 找出一共有多少个页面[/font]
[font=宋体]def find_depth(res):[/font]
[font=宋体]    soup = bs4.BeautifulSoup(res.text, 'html.parser')[/font]
[font=宋体]    depth = soup.find('span', class_='next').previous_sibling.previous_sibling.text[/font]
 
[font=宋体]    return int(depth)[/font]
 
[font=宋体]def save_to_excel(result):[/font]
[font=宋体]    wb = openpyxl.Workbook()[/font]
[font=宋体]    ws = wb.active[/font]
 
[font=宋体]    ws['A1'] = "电影名称"[/font]
[font=宋体]    ws['B1'] = "评分"[/font]
[font=宋体]    ws['C1'] = "资料"[/font]
 
[font=宋体]    for each in result:[/font]
[font=宋体]        ws.append(each)[/font]
 
[font=宋体]    wb.save("豆瓣TOP250电影.xlsx")[/font]
 
[font=宋体]def main():[/font]
[font=宋体]    host = "https://movie.douban.com/top250"[/font]
[font=宋体]    res = open_url(host)[/font]
[font=宋体]    depth = find_depth(res)[/font]
 
[font=宋体]    result = [][/font]
[font=宋体]    for i in range(depth):[/font]
[font=宋体]        url = host + '/?start=' + str(25 * i)[/font]
[font=宋体]        res = open_url(url)[/font]
[font=宋体]        result.extend(find_movies(res))[/font]
 
[font=宋体]    '''[/font]
[font=宋体]    with open("test.txt", "w", encoding="utf-8") as f:[/font]
[font=宋体]        for each in result:[/font]
[font=宋体]            f.write(each)[/font]
[font=宋体]    '''[/font]
 
[font=宋体]    save_to_excel(result)[/font]
[font=宋体]     [/font]
[font=宋体]if __name__ == "__main__":[/font]
[font=宋体]    main()


程序实现如下:

1111.png

如果现在要你从这 250 部电影中按评分进行排序,应该如何做呢?



附件: 中央纪委python1.rar (40.35 KB, 下载次数: 52)          多多评分,刷起你们手中鲜花

免费评分

参与人数 8吾爱币 +10 热心值 +7 收起 理由
haosn + 1 谢谢@Thanks!
纸条 + 2 + 1 支持!
灰色老K + 1 + 1 现在正需要使用Excel处理
KNOPSTEAM + 1 + 1 谢谢@Thanks!
lai2000 + 1 + 1 热心回复!
changjiang + 1 + 1 我很赞同!
music984 + 1 + 1 我很赞同!
venus + 2 + 1 留用,工作就是需要处理类似excel数据,csv

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

leeqng 发表于 2018-1-30 07:00 来自手机
学习了,多谢多谢
Ls雷 发表于 2018-1-30 01:07
mrwinner 发表于 2018-1-30 07:51
music984 发表于 2018-1-30 08:35
正在入门中 学习
apollo636 发表于 2018-1-30 09:25
人生苦短,我用Python
fanai 发表于 2018-1-30 10:09
为什么不先排序后写入?
葫芦炒鸡蛋 发表于 2018-1-30 23:29
感谢分享教程
吟枫舞墨 发表于 2018-2-8 19:42
[Python] 纯文本查看 复制代码
# 将查到的结果添加到简介的列表
    for each in targets:
        try:
            messages.append(each.p.text.split('\n')[1].strip() + each.p.text.split('\n')[2].strip())
        except:
            continue

请问这里为什么用try,而不是直接写入呢,有点不明白,求教~
吟枫舞墨 发表于 2018-2-8 19:53
        result.extend(find_movies(res))     # 以搜索结果扩充列表result
    '''
    with open("test.txt", "w", encoding="utf-8") as f:
    for each in result:
    f.write(each)
    '''
去掉这部分会对程序有什么影响呢?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 06:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表