程语欣 发表于 2018-1-30 00:31

使用 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 部电影中按评分进行排序,应该如何做呢?



附件:         多多评分,刷起你们手中鲜花

leeqng 发表于 2018-1-30 07:00

学习了,多谢多谢

Ls雷 发表于 2018-1-30 01:07

等明年我学完Py告诉你

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

# 将查到的结果添加到简介的列表
    for each in targets:
      try:
            messages.append(each.p.text.split('\n').strip() + each.p.text.split('\n').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)
    '''
去掉这部分会对程序有什么影响呢?
页: [1] 2 3 4 5
查看完整版本: 使用 Python 读写 Excel 文件(一)