Summary of Automate the Boring Stuff with Python

本书是为如何用Python进行自动化处理工作以及可以用在哪些方面,面向的人群为想要提高生产力,减少重复劳动的非程序员。

作为一个未来的程序员,我为什么推荐这本面向非程序员的书呢?在我看来,code是一个工具,既然是一种工具,就应该用于帮助解决问题和满足需求。但实际上,在我们许多的coding相关的学习中,我们并没有考虑why,而是简单粗暴地去学习what,这样学习效率不高,而且最关键的是会有一种不知道有什么用/有没有用的迷茫感,从而丧失继续学习的动力。因此,我推荐这本书,从需求出发,以需求作为目标驱动,告诉你能干什么,而且具体的使用部分也不必按部就班的学习,掌握一定的基础语法后即可根据需求跳转到相关部分。

本书结构分为三部分:

  1. 开头首先解释了为什么可以用编程提高效率以及为什么选择Python
  2. Python的学习
  3. Python在日常生活/工作的具体使用

鉴于笔者已经学习过Python,故直接跳过前两部分,进行阅读记录。

读写文件

文件

  • 程序运行时,数据可以存储变量中,但若想持久地存储数据,则需存储在文件中
  • 文件的表示由路径+文件名组成
  • Windows系统路径使用\进行分隔 而Linux/Mac使用/,为确保代码能统一运行,可使用os.path.join进行连接路径
  • os.path.getsize获取文件大小
  • os.listdir获取文件夹内容
  • 文件按内容可分为文本文件和二进制文件

读写

  • 过程
    1. open(path, mode='r')打开文件返回File对象
    2. 通过readwrite对文件对象进行读写
    3. close关闭文件对象
  • 文件打开分为读(r),写(w),追加(a)
  • read以字符串形式返回整个文件内容,readline逐行返回
  • 可通过shelve模块进行变量的读取和保存

实例

随机生成测试文件

地理老师打算给35个学生出一份关于美国50个州对应的城市的选择题,目标形式为35个测试题文件,35个对应的答案文件,要求是35份选择题不一样,其中题目顺序不一样,选择题选项不一样。

  1. 将测试数据以dict的形式存储在文件中/输入代码中
  2. 创建测试文件和答案文件,并写入首部信息
  3. 随机函数打乱数据给出的州的顺序,选出对应的城市,在给出的城市数据中删去正确答案,随机选出3个作为错误答案
  4. 将3中得到的州以及选项城市写入测试文件和答案文件

多重剪贴板

当需要多次进行复制粘贴时,下次的复制内容会把上一次的内容给覆盖,这样当需要重复使用复制内容时就很不方便。因此,实现多重剪贴板的功能,可以记录过往的复制内容,便于重复使用。

  1. 每次运行程序时通过shelve读取本地的变量数据
  2. 根据输入的参数判断执行的功能
  3. 当需要记录剪贴板时,调用pyperclip.paste获取当前剪贴板内容,并存至变量
  4. 当需要展示历史剪贴板内容时,将存储的变量列表或单个变量转化为字符串通过pyperclip.copy复制进剪贴板

整理文件

批量处理文件,包括遍历,复制,重命名,移动或压缩。主要使用shutil模块

  • 复制:
    • shutil.copy
    • shutil.copytree
  • 移动:
    • shutil.move
  • 删除
    • os.unlink
    • os.rmdir 空目录
    • os.retree 目录所有
  • 遍历 os.walk 返回迭代器关于 current_folder,sub_folders,files
  • 压缩 zipfile模块

实例

文件名字转换

将数千个文件的名字中的美式时间
(MM-DD-YYYY)改为欧式时间
(DD-MM-YYYY)

  1. 构造正则表达式用于识别时间
  2. 遍历目录的名字 os.listdir,并通过正则表达式进行识别,并将其分割
  3. 若满足正则表达式,则通过shutil.move改名

相关任务

  • 批量文件名字添加前缀

文件夹压缩

将指定文件夹及其下所有文件和文件夹压缩

  1. 寻找一可用不重复的压缩路径+文件名
  2. 创建压缩文件
  3. 遍历目录,将所有文件和文件夹写入压缩文件
  4. 关闭压缩文件

WEB爬取

设计模块

  • webbrowser
    • open 打开网页
  • request
    • get 获取资源
    • raise_for_status 判断是否就绪
    • iter_content 获取内容的迭代器
  • Beautiful Soup 解析HTML文档
    • select
  • Selenium

实例

批量打开网页

根据给出的地址批量打开Google Map的网页

  1. 根据给出的地址生成URL地址
  2. 使用webbrowser.open打开URL地址的网页

搜索关键词

根据关键词进行google搜索,并将搜索结果的每一个页面打开

  1. 根据关键词使用request.get
    请求搜索结果页面
  2. 使用Beautiful Soup解析页面,找出所有搜索结果的超链接
  3. 使用webbrowser.open打开获取的超链接

类似用途:

  • 打开购物页面所有商品的页面
  • 打开商品的所有评价页面
  • 获取搜索图片的所有结果

下载网页漫画

下载XKCD的漫画,下载完后下载上一页,直至下载完第一页后结束

  1. 获取XKCD的网页,抽取漫画部分写入文件
  2. 找到上一页按钮的超链接,并获取上一页的漫画网页
  3. 重复1-2直至找不到上一页按钮

操作Excel

利用第三方模块openpyxl,进行excel文件的读写

  • load_workbook
  • get_sheet_by_name
  • cell(row=1, column=2)
  • save

实例

读取Excel并统计数据

根据Excel文件的数据,进行聚类分析,分别进行聚类计数以及聚类求和。
事实上,Excel本身功能即可完成并且更加简单,故跳过。

更新Excel文件中指定列

读取Excel文件,遍历每一行,如果该行为指定商品,则修改其价格

操作PDF

  • 打开PDF文件并提取文本
  • PDF文档解密——输入密码
  • 文档加密
  • 创建pdf文件,添加页面
  • pdf页面合并——添加水印

实例

多个PDF文档指定页面合并

选择目录下所有PDF文档的非首页按照字典序合并到一个新的PDF文档中

  1. 获取当前目录所有文件名,并取出以.pdf结尾的文件名添加至数组
  2. 数组根据文件名排序
  3. 按顺序打开每一个PDF文档,每一个文档读取从第二页开始读取,添加至新文档
  4. 保存新文档

操作CSV和JSON

CSV

通过csv模块,可以进行csv的读写。读取类似于一个二维数组,写可以通过write_row写入行。

实例

读取目录下所有csv文件的数据,去除首部信息

  1. 获取目录所有文件名,并进行遍历,非csv文件跳过
  2. 打开csv文件,读取csv数据,跳过第一行,其余的行添加进数组
  3. 将数组中的行以csv方式写入新文件

JSON

Json为常用的一个数据格式,多用于API之间进行交互,但日常生活中用得比较少。通过json模块,可以将json格式的字符串转成dict。

获取实时天气数据

通过网上提过的天气服务接口,获取指定地点的实时天气情况

  1. 通过命令行获取地点输入
  2. 将地点作为参数向指定天气服务API发送HTTP请求
  3. 解析返回的json数据,进行输出

操作Email

实例

根据Excel表格中的会员数据情况,给其中尚未支付本月会籍费用的会员发送邮件进行提醒

  1. 打开Excel文件读取会员数据,判断最后一列是否为paid,若是,则记录会员名与邮箱地址
  2. 通过模块smtplib登录邮箱,跟根据上一步记录的信息一一发送邮件

自动化操作鼠标和键盘

通过第三方模块pyautogui实现,可进行图形界面的相关操作:

  • 控制鼠标以指定速度移动
  • 获取鼠标位置
  • 鼠标进行交互操作
    • 点击
    • 拖动
    • 滚动
  • 截屏
  • 图像识别
  • 键盘按下/松开 指定键/组合键