学习笔记

文章目录

  • 基础
    • 整型、浮点型和字符串数据类型
    • 字符串连接和复制
    • 变量命名规则
    • `print()`函数
    • `input()`函数
    • `len()`函数
    • `str() float() int()`函数
  • 控制流
    • 布尔值
    • 比较操作符
    • 布尔操作符
    • 控制流语句
      • `if else elif`
      • `while`
      • `break`跳出该层循环
      • `continue`直接进行下次循环
      • `for` 循环和`range()`函数
      • `range()`的开始、停止和步长参数
      • 导入模块
      • 用`sys.exit()`提前结束程序
  • 函数
    • `None` 值
    • 局部和全局作用域
    • 名称相同的局部变量和全局变量
    • `global` 语句
    • 异常梳理
  • 列表
    • 列表数据类型
      • 用下标取得列表中的单个值
      • 负数下标
      • 利用切片取得子列表
      • 用下标改变列表中的值
      • 列表连接和列表复制
      • 用`del `语句从列表中删除值
    • 列表用于循环
      • `in` 和`not in` 操作符
      • 多重赋值技巧
    • 增强的赋值操作
    • 方法
      • 用`index()`方法在列表中查找值
      • 用`append()`和`insert()`方法在列表中添加值
      • 用`remove()`方法从列表中删除值
      • 用`sort()`方法将列表中的值排序
    • 类似列表的类型:字符串和元组
      • 元组数据类型
      • 用`list()`和`tuple()`函数来转换类型
      • 引用
      • `copy` 模块的`copy()`和`deepcopy()`函数
  • 字典和结构化数据
    • 字典数据类型
    • `keys()`、`values()`和`items()`方法
    • `get()`方法
    • `setdefault()`方法
    • 漂亮打印
  • 字符串操作
    • 处理字符串
      • 字符串可以用双引号开始和结束,就像用单引号一样。使用双引号的一个好处,就是字符串中可以使用单引号字符
      • 转义字符
      • 原始字符串
      • 用三重引号的多行字符串
      • 多行注释
      • 字符串下标和切片
    • 有用的字符串方法
      • 字符串方法`upper()`、`lower()`、`isupper()`和`islower()`
      • 字符串方法`startswith()`和`endswith()`
      • 字符串方法`join()`和`split()`
      • 用`rjust()`、`ljust()`和`center()`方法对齐文本
      • 用`trip()`、`rstrip()`和`lstrip()`删除空白字符
    • 用pyperclip 模块拷贝粘贴字符串
    • 处理命令行参数
  • 模式匹配与正则表达式
    • 用正则表达式查找文本模式
      • 创建正则表达式对象
      • 匹配`Regex` 对象
    • 用正则表达式匹配更多模式
      • 利用括号分组
      • 用管道匹配多个分组
      • 用问号实现可选匹配
      • 用星号匹配零次或多次
      • 用加号匹配一次或多次
      • 用花括号匹配特定次数
    • 贪心和非贪心匹配
    • findall()方法
    • 字符分类
    • 建立自己的字符分类
    • 插入字符和美元字符
    • 通配字符
      • 用点-星匹配所有字符
      • 用句点字符匹配换行
    • 不区分大小写的匹配
    • 用`sub()`方法替换字符串
    • 管理复杂的正则表达式
    • 组合使用`re.IGNORECASE、re.DOTALL `和`re.VERBOSE`
  • 读写文件
    • 文件与文件路径
      • `Windows` 上的倒斜杠以及`OS X` 和`Linux` 上的正斜杠
        • `os.path.join()`
      • 当前工作目录
        • `os.getcwd()` 和 `os.chdir()`
      • 绝对路径与相对路径
      • 用`os.makedirs()`创建新文件夹
      • `os.path` 模块
      • 处理绝对路径和相对路径
      • 查看文件大小和文件夹内容
      • 检查路径有效性
    • 文件读写过程
      • 用`open()`函数打开文件
      • 读取文件内容
      • 写入文件
    • 用`shelve` 模块保存变量
    • 用`pprint.pformat()`函数保存变量
  • 组织文件
    • `shutil`模块
      • 复制文件和文件夹
        • `shutil.copy(source,destination)` 复制文件
        • `shutil.copytree(source,destination)` 复制文件夹
      • 文件和文件夹的移动与改名
      • 永久删除文件和文件夹
      • 用`send2trash` 模块安全地删除,可以在回收站找到
    • 用`zipfile` 模块压缩文件
      • 读取`ZIP`文件
      • 解压缩
      • 创建和添加到`ZIP` 文件
      • 将一个文件夹备份到一个`ZIP` 文件
  • 调试
    • 抛出异常
    • 取得反向跟踪的字符串
    • 断言
      • 禁用断言
    • 日志
      • 使用日志模块
      • 日志级别
      • 禁用日志
      • 将日志记录到文件
  • 从Web 抓取信息
    • 用`requests` 模块从`Web` 下载文件
      • 用`requests.get()`函数下载一个网页
      • 检查错误
      • 将下载的文件保存到硬盘
    • 用`BeautifulSoup` 模块解析`HTML`
      • 从`HTML` 创建一个`BeautifulSoup` 对象
      • 用`select()`方法寻找元素
    • 用`selenium` 模块控制浏览器
      • 在页面中寻找元素
      • 点击页面
      • 填写并提交表单
      • 发送特殊键
      • 点击浏览器按钮
  • 处理Excel 电子表格
    • `openpyxl`
  • 处理PDF 和Word 文档
    • PyPDF2
    • docx
  • 处理CSV 文件和JSON 数据
    • csv 模块
    • json模块
  • 保持时间、计划任务和启动程序
    • `time` 模块
      • `time.time()`函数
      • `time.sleep()`函数
    • `datetime` 模块
      • `timedelta` 数据类型
      • 将`datetime` 对象转换为字符串
      • 将字符串转换成`datetime` 对象
    • 多线程
      • 创建一个`Thread` 对象
      • 向线程的目标函数传递参数
    • 从`Python` 启动其他程序
      • `Popen`对象
      • 向`Popen()`传递命令行参数
      • 用默认的应用程序打开文件
  • 发送电子邮件和短信
  • 操 作 图 像
    • `pillow`模块
      • 颜色和`RGBA` 值
      • 坐标和`Box`元组
    • 用 `Pillow`操作图像
      • `Image`模块
      • 处理 `Image`数据类型
      • 裁剪图片
      • 复制和粘贴图像到其他图像
      • 调整图像大小
      • 旋转和翻转图像
      • 更改单个像素
    • 在图像上绘画
      • 绘制形状
      • 绘制文本
  • 用`GUI`自动化控制键盘和鼠标
    • 走对路
      • 通过注销关闭所有程序
      • 暂停和自动防故障装置
    • 控制鼠标移动
      • 移动鼠标
      • 获取鼠标位置
    • 控制鼠标交互
      • 点击鼠标
      • 拖动鼠标
      • 滚动鼠标
    • 处理屏幕
      • 获取屏幕快照
      • 分析屏幕快照
    • 控制键盘
      • 通过键盘发送一个字符串
      • 键名
      • 按下和释放键盘
      • 热键组合

基础

整型、浮点型和字符串数据类型

字符串连接和复制

  • 'abc' + 'def'
    
  • 'abc' * 5 #字符串变为 abc 重复5次,必须为整型
    

变量命名规则

  1. 只能是一个词。
  2. 只能包含字母、数字和下划线。
  3. 不能以数字开头。

print()函数

关键字:

  • seq 会指定print()内元素间隔用什么取代,默认是空格

    print('hello', 'world', seq='')
    
  • end 会指定两个`print()'之间是否换行,默认是自动添加换行
    print('hello',end='')
    print('world')
    

input()函数

  • 下例会在输入前输出 Your name is 作为提示,然后将输入赋给 name

    name = input('Your name is: ')
    

len()函数

  • 获取长度,如字符串长度,数组长度

str() float() int()函数

  • 返回相应类型的数据

控制流

布尔值

  • True
  • False
  • 首字母大写

比较操作符

布尔操作符

  • and
  • not
  • or

控制流语句

代码块规则:

  1. 缩进增加时,代码块开始。
  2. 代码块可以包含其他代码块。
  3. 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了。

if else elif

if name == 'Alice':print('Hi, Alice.')
elif age < 12:print('You are not Alice, kiddo.')
else:print('You are neither Alice nor a little kid.')

while

name = ''
while name != 'your name':print('Please type your name.')name = input()print('Thank you!')

break跳出该层循环

continue直接进行下次循环

for 循环和range()函数

name = ''
for i in range(7):print(i)

[0,7)[0,7)[0,7)

range()的开始、停止和步长参数

range(12,16)  #[12,16)
range(0,10,2) #第三个元素为步长 0 2 4 6 8

导入模块

import 语句包含以下部分:

  • import 关键字;
  • 模块的名称;
  • 可选的更多模块名称,之间用逗号隔开。
import random
import random, sys, os, math
# 调用模块内函数时候
random.randit(1,7)  #必须以模块名.函数名的形式
from random import *  #若以该形式导入模块就直接使用函数名调用

sys.exit()提前结束程序

函数

  def hello(name):print('Hello ' + name)return name

None

  • NoneNoneType 数据类型的唯一值(其他编程语言可能称这个值为nullnilundefined)。就像布尔值TrueFalse一样,None 必须大写首字母N

局部和全局作用域

名称相同的局部变量和全局变量

def spam():eggs = 'spam local'print(eggs) # prints 'spam local'def bacon():eggs = 'bacon local'print(eggs) # prints 'bacon local'spam()print(eggs) # prints 'bacon local'eggs = 'global'
bacon()
print(eggs) # prints 'global'

结果会是

bacon local
spam local
bacon local
global
变量名相同时,会屏蔽全局变量

global 语句

如果需要在一个函数内修改全局变量,就使用global 语句

def spam():global eggseggs = 'spam'eggs = 'global'
spam()
print(eggs)

异常梳理

如果在try 子句中的代码导致一个错误,程序执行就立即转到except 子句的代
码。

def spam(divideBy):
try:return 42 / divideBy
except ZeroDivisionError:print('Error: Invalid argument.')

列表

列表数据类型

  • ['cat', 'bat', 'rat', 'elephant']
  • []是一个空列表,不包含任何值,类似于空字符串

用下标取得列表中的单个值

spam = ['cat', 'bat', 'rat', 'elephant']
spam[1]spam = [['cat', 'bat'], [10, 20, 30, 40, 50]]
spam[0]
spam[0][1]

负数下标

  • 整数值−1 指的是列表中的最后一个下标
  • −2 指的是列表中倒数第二个下标,以此类推

利用切片取得子列表

spam[1:3] #左闭右开
spam[:2]
spam[:]

用下标改变列表中的值

列表连接和列表复制

[1, 2, 3] + ['A', 'B', 'C']
['X', 'Y', 'Z'] * 3

del语句从列表中删除值

  • del 语句将删除列表中下标处的值,表中被删除值后面的所有值,都将向前移
    动一个下标

列表用于循环

innot in 操作符

'howdy' in ['hello', 'hi', 'howdy', 'heyas']
#返回布尔值

多重赋值技巧

cat = ['fat', 'black', 'loud']
size, color, disposition = cat
# size color disposition 将依次被赋予与列表cat顺序相同的值

增强的赋值操作

bacon *= 3

方法

index()方法在列表中查找值

  • 列表值有一个index()方法,可以传入一个值,如果该值存在于列表中,就返回它
    的下标。如果该值不在列表中,Python 就报 ValueError
  • 如果列表中存在重复的值,就返回它第一次出现的下标
spam = ['hello', 'hi', 'howdy', 'heyas']
spam.index('hello') #返回下标0

append()insert()方法在列表中添加值

  • append()方法调用,将参数添加到列表末尾
  • insert()方法可以在列表任意下标处插入一个值。insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值
  • append()insert()都不会将 列表 的新值作为其返回值(类似于void函数)

remove()方法从列表中删除值

  • remove()方法传入一个值,它将从被调用的列表中删除。

    spam = ['zophie','fat','yellow']
    spam.remove('fat')
    
  • 如果该值在列表中出现多次,只有第一次出现的值会被删除

sort()方法将列表中的值排序

  • 数值的列表或字符串的列表,能用 sort()方法排序

    spam = [2, 5, 3.14, 1, -7]
    spam.sort()
    
  • 数值按照大小
  • 对字符串排序时,使用“ASCII 字符顺序”,而不是实际的字典顺序;这意味着大写字母排在小写字母之前。因此在排序时,小写的a 在大写的Z 之后
  • 如果需要按照普通的字典顺序来排序,就在sort()方法调用时,将关键字参数key 设置为str.lower
    spam = ['a', 'z', 'A', 'Z']
    spam.sort(key=str.lower)
    
  • 同样无返回值
  • 也可以指定reverse关键字参数为True,让sort()按逆序排序。
    spam.sort(reverse=True)
    spam
    

类似列表的类型:字符串和元组

元组数据类型

  • 元组输入时用圆括号(),而不是用方括号[]
  • 元组不能让它们的值被修改、添加或删除。
    spam=('cat','name','fat')
  • 如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python 将认为,你只是在一个普通括号内输入了一个值。

list()tuple()函数来转换类型

tuple(['cat', 'dog', 5])
list(('cat', 'dog', 5))

引用

spam = 42
cheese = spam
pam = 100

spam和cheese
是不同的变量,保存了不同的值,改变spam或者cheese不会影响另一个值

但列表不是这样的。当你将列表赋给一个变量时,实际上是将列表的“引用”赋给了该变量。引用是一个值,指向某些数据。列表引用是指向一个列表的值

spam = [0, 1, 2, 3, 4, 5]
cheese = spam
cheese[1] = 'Hello!'

代码只改变了cheese 列表,但似乎cheese 和spam 列表同时发生了改变

copy 模块的copy()deepcopy()函数

  • copy.copy()可以用来复制列表或字典这样的可变值,而不只是复制引用

    import copy
    spam = ['A', 'B', 'C', 'D']
    cheese = copy.copy(spam)
    cheese[1] = 42
    
  • deepcopy()函数将同时复制它们内部的列表

字典和结构化数据

字典数据类型

  • 字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值
    称为“键-值”对。
myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
myCat['size']
  • 不像列表,字典中的表项是不排序的,键-值对输入的顺序并不重要
  • 因为字典是不排序的,所以不能像列表那样切片

keys()values()items()方法

  • 有3 个字典方法,它们将返回类似列表的值,分别对应于字典的键、值和键-值对:keys()、values()和items()
  • 这些方法返回的值不是真正的列表,它们不能被修改,没有append()方法。但这些数据类型(分别是dict_keys、dict_values 和dict_items)可以用于for 循环。

get()方法

  • ,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。
  • 不使用get(),当访问一个不存在的键-值,代码就会产生一个错误消息
  • dict.get(key,value)

setdefault()方法

  • 传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值
  • get()区别是:get只是返回值,并不更改/添加键-值,setdefault则是设置默认值(如果不存在)并返回value,若存在则返回value

漂亮打印

  • 导入pprint 模块,就可以使用pprint()pformat()函数
  • 使用pprint输出字典等,输出的字典是有序的,但不影响原本字典的内容
  • 以下两行代码等价
    pprint.pprint(someDictionaryValue)
    print(pprint.pformat(someDictionaryValue))
    

字符串操作

处理字符串

字符串可以用双引号开始和结束,就像用单引号一样。使用双引号的一个好处,就是字符串中可以使用单引号字符

转义字符

原始字符串

  • 在字符串开始的引号之前加上r,使它成为原始字符串。“原始字符串”完全忽略所有的转义字符,打印出字符串中所有的倒斜杠

用三重引号的多行字符串

  • 在Python 中,多行字符串的起止是3 个单引号或3 个双引号。“三重引号”之间的所有引号、制表符或换行,都被认为是字符串的一部分。Python 的代码块缩进规则不适用于多行字符串

多行注释

  • 单行注释 #
  • 多行注释 如同多行字符串 三重引号之间就是注释的内容

字符串下标和切片

  • 左闭右开

有用的字符串方法

字符串方法upper()lower()isupper()islower()

  • upper()lower()字符串方法返回一个新字符串,其中原字符串的所有字母都被相应地转换为大写或小写。字符串中非字母字符保持不变

    • 这些方法没有改变字符串本身,而是返回一个新字符串
  • 如果字符串至少有一个字母,并且所有字母都是大写或小写,isupper()islower()方法就会相应地返回布尔值True。否则,该方法返回False
  • 因为upper()lower()字符串方法本身返回字符串,所以也可以在“那些”返回的字符串上继续调用字符串方法。这样做的表达式看起来就像方法调用链
  • isX 字符串方法
    还有几个字符串方法,它们的名字以 is 开始。这些方法返回一个布尔值,描述了字符串的特点

    • isalpha()返回True,如果字符串只包含字母,并且非空;
    • isalnum()返回True,如果字符串只包含字母和数字,并且非空;
    • isdecimal()返回True,如果字符串只包含数字字符,并且非空;
    • isspace()返回True,如果字符串只包含空格、制表符和换行,并且非空;
    • istitle()返回True,如果字符串仅包含以大写字母开头、后面都是小写字母的单词

字符串方法startswith()endswith()

  • startswith()endswith()方法返回True,如果它们所调用的字符串以该方法传入的字符串开始或结束。否则,方法返回False

字符串方法join()split()

  • join()方法在一个字符串上调用,参数是一个字符串列表,返回一个字符串。返回的字符串由传入的列表中每个字符串连接而成

    ', '.join(['cats', 'rats', 'bats']) #返回字符串
    
  • split()方法做的事情正好相反:它针对一个字符串调用,返回一个字符串列表
    'My name is Simon'.split()
    # 返回字符串列表,分割依据是单词间的空格
    

rjust()ljust()center()方法对齐文本

  • rjust()ljust()字符串方法返回调用它们的字符串的填充版本,通过插入空格(默认情况下)来对齐文本。
  • 这两个方法的第一个参数是一个整数长度,用于对齐字符串
  • 第二个可选参数将指定一个填充字符,取代空格字符
  • center()字符串方法与ljust()rjust()类似,但它让文本居中,而不是左对齐或右对齐

trip()rstrip()lstrip()删除空白字符

  • strip()字符串方法将返回一个新的字符串,它的开头或末尾都没有空白字符。
  • lstrip()rstrip()方法将相应删除左边或右边的空白字符
  • 有一个可选的字符串参数,指定两边的哪些字符应该删除
    • 传入strip()方法的字符串中,字符的顺序并不重要
      ``python
      spam = ‘SpamSpamBaconSpamEggsSpamSpam’
      spam.strip(‘ampS’)

用pyperclip 模块拷贝粘贴字符串

  • pyperclip模块有copy()paste()函数,可以向计算机的剪贴板发送文本,或从它接收文本

处理命令行参数

  • 命令行参数将存储在变量sys.argv 中

    • python pw.py name 那么sys.argv[0] = ‘pw.py’,sys.argv[1]=‘name’

模式匹配与正则表达式

用正则表达式查找文本模式

创建正则表达式对象

import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
  • re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex 模式对象(或者就简称为Regex 对象

匹配Regex 对象

  • Regex 对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search()方法将返回None。如果找到了该模式,search()方法将返回一个Match 对象
  • Match 对象有一个group()方法,它返回被查找字符串中实际匹配的文本
    phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
    mo = phoneNumRegex.search('My number is 415-555-4242.')
    print('Phone number found: ' + mo.group())
    
  • group()返回匹配到的内容
  • group(0)返回匹配到的内容
  • group(1)返回正则表达式中第一个括号内的内容,第一组

用正则表达式匹配更多模式

利用括号分组

  • group()匹配对象方法传入整数 1 或 2 ,就可以取得匹配文本的不同部分。
  • group()方法传入 0 或不传入参数,将返回整个匹配的文本
  • 如果想要一次就获取所有的分组,使用groups()方法,返回多个值的元组

用管道匹配多个分组

  • 字符 | 称为“管道”。希望匹配许多表达式中的一个时,就可以使用它
  • 第一次出现的匹配文本,将作为Match 对象返回。

用问号实现可选匹配

batRegex = re.compile(r'Bat(wo)?man')

正则表达式中的(wo)?部分表明,模式 wo 是可选的分组。该正则表达式匹配的文本中,wo 将出现零次或一次

用星号匹配零次或多次

  • *(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复

用加号匹配一次或多次

  • 加号前面的分组必须“至少出现一次”

用花括号匹配特定次数

  • 如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例如,正则表达式(Ha){3}将匹配字符串'HaHaHa',但不会匹配'HaHa'
  • 除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值。例如,正则表达式(Ha){3,5}将匹配'HaHaHa''HaHaHaHa''HaHaHaHaHa'
  • 也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值(类似于分片)
    比如(Ha){3,}将匹配3次或更多次

贪心和非贪心匹配

  • Python 的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。比如(Ha){3,5}遇到'HaHaHaHaHa'会返回'HaHaHaHaHa'即是匹配最长字符
  • 花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号。
    比如(Ha){3,5}?遇到'HaHaHaHaHa'会返回'HaHaHa'

findall()方法

  • findall()方法将返回一组字符串,包含被查找字符串中的所有匹配
  • findall()不是返回一个Match 对象,而是返回一个字符串列表,只要在正则表达式中没有分组。
  • 如果在正则表达式中有分组,那么findall 将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每个分组的匹配字符串

字符分类

  • \d 0 到9 的任何数字
  • \D 除0 到9 的数字以外的任何字符
  • \w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
  • \W 除字母、数字和下划线以外的任何字符
  • \s 空格、制表符或换行符(可以认为是匹配“空白”字符)
  • \S 除空格、制表符和换行符以外的任何字符

建立自己的字符分类

  • 用方括号定义自己的字符分类
  • 使用短横表示字母或数字的范围
  • 在方括号内,普通的正则表达式符号不会被解释。这意味着,你不需要前面加上倒斜杠转义.、*、?()字符
  • 通过在字符分类的左方括号后加上一个插入字符^,就可以得到“非字符类。非字符类将匹配不在这个字符类中的所有字符
    ^[ABSGHDH]

插入字符和美元字符

  • 在正则表达式的开始处使用插入符号^,表明匹配必须发生在被查找文本开始处
  • 正则表达式的末尾加上美元符号$,表示该字符串必须以这个正则表达式的模式结束

通配字符

  • . (句点)字符称为“通配符”。它匹配了换行之外的所有字符。

用点-星匹配所有字符

用句点字符匹配换行

  • 通过传入re.DOTALL 作为re.compile()的第二个参数,可以让句点字符匹配所有字符,包括换行字符。

不区分大小写的匹配

  • 。要让正则表达式不区分大小写,可以向re.compile()传入re.IGNORECASEre.I,作为第二个参数。

sub()方法替换字符串

  • Regex对象的sub()方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。sub()方法返回替换完成后的字符串

管理复杂的正则表达式

如果要匹配的文本模式很简单,正则表达式就很好。但匹配复杂的文本模式,可能需要长的、费解的正则表达式。你可以告诉re.compile(),忽略正则表达式字符串中的空白符和注释,从而缓解这一点。要实现这种详细模式,可以向re.compile()传入变量re.VERBOSE,作为第二个参数。

phoneRegex = re.compile(r'((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)')

可以将正则表达式放在多行中,并加上注释

phoneRegex = re.compile(r'''((\d{3}|\(\d{3}\))? # area code(\s|-|\.)? # separator\d{3} # first 3 digits(\s|-|\.) # separator\d{4} # last 4 digits(\s*(ext|x|ext.)\s*\d{2,5})? # extension)''', re.VERBOSE)

组合使用re.IGNORECASE、re.DOTALLre.VERBOSE

  • re.compile()函数只接受一个值作为它的第二参数
  • 可以使用管道字符(|)将变量组合起来,从而绕过这个限制。管道字符在这里称为“按位或”操作符。

读写文件

文件与文件路径

Windows 上的倒斜杠以及OS XLinux 上的正斜杠

  • Windows 上,路径书写使用倒斜杠作为文件夹之间的分隔符。
  • OS X 和Linux` 上,使用正斜杠作为它们的路径分隔符。

os.path.join()

  • 。如果将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()就会返回一个文件路径的字符串,包含正确的路径分隔符
import os
os.path.join('usr', 'bin', 'spam')
## 结果是'usr\\bin\\spam'

当前工作目录

os.getcwd()os.chdir()

可以取得当前工作路径的字符串,并可以利用os.chdir()改变它

绝对路径与相对路径

os.makedirs()创建新文件夹

将创建所有必要的中间文件夹,目的是确保完整路径名存在

os.path 模块

  • 导入 import osos.pathos 模块中的模块,)

处理绝对路径和相对路径

os.path 模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的路径是否为绝对路径。

  • 调用 os.path.abspath(path)将返回参数的绝对路径的字符串。这是将相对路径转换为绝对路径的简便方法。
  • 调用 os.path.relpath(path, start)将返回从start 路径到path 的相对路径的字符串。如果没有提供start,就使用当前工作目录作为开始路径。
  • 调用 os.path.isabs(path),如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False
  • 基本名称跟在路径中最后一个斜杠后,它和文件名一样
  • 目录名称是最后一个斜杠之前的所有内容
  • 调用 os.path.dirname(path)将返回一个字符串,它包含path 参数中最后一个斜杠之前的所有内容。
  • 调用os.path.basename(path)将返回一个字符串,它包含path 参数中最后一个斜杠之后的所有内容。
  • 如果同时需要一个路径的目录名称和基本名称,就可以调用os.path.split(),获得这两个字符串的元组
  • os.path.split()不会接受一个文件路径并返回每个文件夹的字符串的列表。如果需要这样,请使用split()字符串方法,并根据os.path.sep 中的字符串进行分割
    • split()字符串方法将返回一个列表,包含该路径的所有部分。如果向它传递os.path.sep,就能在所有操作系统上工作。
    calcFilePath = 'C:\\Windows\\System32\\calc.exe'
    calcFilePath.split(os.path.sep)
    # 默认情况下 os.path.seq 会自动根据PC来适应
    

查看文件大小和文件夹内容

os.path 模块提供了一些函数,用于查看文件的字节数以及给定文件夹中的文件和子文件夹。

  • 调用 os.path.getsize(path)将返回path 参数中文件的字节数
  • 调用 os.listdir(path)将返回文件名字符串的列表,包含path 参数中的每个文件(请注意,这个函数在os 模块中,而不是os.path
  • 调用os.walk()函数列出文件夹以及子文件夹中的每个文件

检查路径有效性

  • 如果 path 参数所指的文件或文件夹存在,调用os.path.exists(path)将返回True,否则返回False
  • 如果 path 参数存在,并且是一个文件,调用os.path.isfile(path)将返回True,否则返回False
  • 如果 path 参数存在,并且是一个文件夹,调用os.path.isdir(path)将返回True,否则返回False

文件读写过程

    1. 调用open()函数,返回一个File 对象。
    2. 调用File 对象的read()或write()方法。
    3. 调用File 对象的close()方法,关闭该文件。
      或者
  • with open(path) as name:# 各种文件对象的操作代码
    

    等价于

    file = open(path)
    # 各种文件对象的操作代码
    file.close()
    

open()函数打开文件

传递的字符串路径可以是绝对路径,也可以是相对路径。open()函数返回一个File 对象。

  • 默认是只读的形式打开
  • 要进行写入操作,传入第二个参数’w’等

读取文件内容

  • helloContent = helloFile.read()将整个文件的内容读取为一个字符串
  • 使用readlines()方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行

写入文件

要以“写入纯文本模式”或“添加纯文本模式”打开该文件,或简称为“写模式”和“添加模式”。

  • 写模式将覆写原有的文件,从头开始;将'w'作为第二个参数传递给open()
  • 'a'作为第二个参数传递给open(),以添加模式打开该文件
  • 如果传递给open()的文件名不存在,写模式和添加模式都会创建一个新的空文件。在读取或写入文件后,调用close()方法,然后才能再次打开该文件。

shelve 模块保存变量

  • 利用shelve 模块,你可以将Python 程序中的变量保存到二进制的shelf 文件中。
import shelve
shelfFile = shelve.open('mydata')
cats = ['Zophie', 'Pooka', 'Simon']
shelfFile['cats'] = cats
shelfFile.close()
  • 就像字典一样,shelf 值有keys()values()方法,返回shelf 中键和值的类似列表的值。因为这些方法返回类似列表的值,而不是真正的列表,所以应该将它们传递给list()函数,取得列表的形式

pprint.pformat()函数保存变量

组织文件

shutil模块

复制文件和文件夹

shutil.copy(source,destination) 复制文件

  • 调用shutil.copy(source, destination),将路径source 处的文件复制到路径destination处的文件夹(sourcedestination 都是字符串)。
  • 如果destination 是一个文件名,它将作为被复制文件的新名字。
  • 该函数返回一个字符串,表示被复制文件的路径

shutil.copytree(source,destination) 复制文件夹

  • 调用shutil.copytree(source, destination),将路径source 处的文件夹,包括它的所有文件和子文件夹,复制到路径destination 处的文件夹。
  • sourcedestination 参数都是字符串。
  • 该函数返回一个字符串,是新复制的文件夹的路径

文件和文件夹的移动与改名

  • 调用shutil.move(source, destination),将路径source 处的文件夹移动到路径destination,并返回新位置的绝对路径的字符串。
  • 如果 destination 指向一个文件夹,source 文件将移动到destination 中,并保持原来的文件名
  • 如果已经存在一个文件,它就会被覆写

永久删除文件和文件夹

  • os.unlink(path)将删除path 处的文件。
  • 调用 os.rmdir(path)将删除path 处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
  • 调用 shutil.rmtree(path)将删除path 处的文件夹,它包含的所有文件和文件夹都会被删除。

send2trash 模块安全地删除,可以在回收站找到

  • send2trash(path)

zipfile 模块压缩文件

读取ZIP文件

import zipfile
wxampleZip = zipfile.ZipFile(path)
exampleZip.namelist()spamInfo = exampletZip.getinfo(file)
spamInfo.file_size
spamInfo.compress_size
  • namelist()方法返回ZIP文件中包含的所有文件和文件夹的字符串的列表
  • 这些字符串可以传递给ZipFile 对象的getinfo()方法,返回一个关于特定文件的ZipInfo 对象。ZipInfo 对象有自己的属性,诸如表示字节数的file_sizecompress_size,它们分别表示原来文件大小和压缩后文件大小
  • ZipFile 对象表示整个归档文件,而ZipInfo 对象则保存该归档文件中每个文件的有用信息

解压缩

  • ZipFile对象的extractall()方法
exampleZip.extractall()
# 解压到工作目录
exampleZip.extractall(path)
# 解压到指定目录下

创建和添加到ZIP 文件

  • 必须以“写模式”打开ZipFile 对象,即传入'w'作为第二个参数
import zipfile
exampleZip = zipfile.ZipFile(path,'w')
exampleZip.write(path,compress_type=zipfile.ZIP_DEFAULTED)
exampleZip.close()

将一个文件夹备份到一个ZIP 文件

  • 递归添加到ZIP文件里面
  • os.walk()

调试

抛出异常

  • 抛出异常使用raise 语句。

    • raise 关键字;
    • Exception 函数的调用;
    • 传递给Exception 函数的字符串,包含有用的出错信息。
def boxPrint(symbol, width, height):if len(symbol) != 1:raise Exception('Symbol must be a single character string.')if width <= 2:raise Exception('Width must be greater than 2.')if height <= 2:raise Exception('Height must be greater than 2.')print(symbol * width)for i in range(height - 2):print(symbol + (' ' * (width - 2)) + symbol)print(symbol * width)
for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):try:boxPrint(sym, w, h)except Exception as err:print('An exception happened: ' + str(err))
  • 这个程序使用了except 语句的except Exception as err 形式。如果boxPrint()返回一个Exception 对象,这条语句就会将它保存在名为err 的变量中。Exception 对象可以传递给str(),将它转换为一个字符串,得到用户友好的出错信息

取得反向跟踪的字符串

  • 只要抛出的异常没有被处理,Python 就会显示反向跟踪。但你也可以调用traceback.format_exc(),得到它的字符串形式。
  • 如果你希望得到异常的反向跟踪的信息,但也希望except 语句优雅地处理该异常,这个函数就很有用
  • 需要导入traceback 模块。
import traceback
try:raise Exception('This is the error message.')
except:errorFile = open('errorInfo.txt', 'w')errorFile.write(traceback.format_exc())errorFile.close()print('The traceback info was written to errorInfo.txt.')
# 将反向跟踪信息写入一个日志文件,并让程序继续运行

断言

  • assert语句包含以下部分:
    assert 关键字;
    条件(即求值为TrueFalse 的表达式);
    逗号;
    当条件为False 时显示的字符串。
  • 当某些语句要在特定条件下才算正确执行,assert用在此处,可以让我们知道这里的运行条件不符合我们的预期(即便这些语句能够正常运行)
  podBayDoorStatus = 'open'assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'podBayDoorStatus = 'I\'m sorry, Dave. I\'m afraid I can't do that.''assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'# 第二行不会抛出异常,字符串的值符合设定;第四行抛出异常,字符串的值不符合设定

禁用断言

  • 在运行Python 时传入-O 选项,可以禁用断言。
  • 参考附录B

日志

记日志是一种很好的方式,可以理解程序中发生的事,以及事情发生的顺序。Pythonlogging 模块使得你很容易创建自定义的消息记录。这些日志消息将描述程序执行何时到达日志函数调用,并列出你指定的任何变量当时的值。另一方面,缺失日志信息表明有一部分代码被跳过,从未执行。

使用日志模块

  • 要启用logging 模块,在程序运行时将日志信息显示在屏幕上,请将下面的代码复制到程序顶部(但在Python#!行之下)
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s
- %(message)s')
  • 打印日志信息时,使用 logging.debug() 函数
  • 这个 debug()函数将调用basicConfig(),打印一行信息。这行信息的格式是我们在basicConfig()函数中指定的,并且包括我们传递给debug() 的消息。
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s
- %(message)s')
logging.debug('Start of program')
def factorial(n):logging.debug('Start of factorial(%s%%)' % (n))total = 1for i in range(n + 1):total *= ilogging.debug('i is ' + str(i) + ', total is ' + str(total))logging.debug('End of factorial(%s%%)' % (n))return total
print(factorial(5))
logging.debug('End of program')
  • 加入一次logging.disable(logging.CRITICAL)调用,就可以禁止日志

日志级别

级别 日志函数 描述
DEBUG logging.debug() 最低级别。用于小细节。通常只有在诊断问题时,你才会关心这些消息
INFO logging.info() 用于记录程序中一般事件的信息,或确认一切工作正常
WARNING logging.warning() 用于表示可能的问题,它不会阻止程序的工作,但将来可能会
ERROR logging.error() 用于记录错误,它导致程序做某事失败
CRITICAL logging.critical() 最高级
  • 日志级别的好处在于,你可以改变想看到的日志消息的优先级
  • basicConfig()函数传入logging.DEBUG 作为level 关键字参数,这将显示所有日志级别的消息(DEBUG是最低的级别)
  • basicConfig()level 参数设置为logging.ERROR,这将只显示ERRORCRITICAL 消息

禁用日志

  • 只要向logging.disable() 传入一个日志级别,它就会禁止该级别和更低级别的所有日志消息

将日志记录到文件

  • logging.basicConfig() 函数接受filename 关键字参数
import logging
logging.basicConfig(filename='myProgramLog.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# 日志信息将被保存到myProgramLog.txt 文件中

从Web 抓取信息

  • webbrowser:是Python 自带的,打开浏览器获取指定页面。
  • requests:从因特网上下载文件和网页。
  • Beautiful Soup:解析HTML,即网页编写的格式。
  • selenium:启动并控制一个Web浏览器。selenium能够填写表单,并模拟鼠标在这个浏览器中点击。
    ##webbrowser 模块
  import webbrowserwebbrowser.open('http://inventwithpython.com/')

requests 模块从Web 下载文件

requests.get()函数下载一个网页

import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
print(res.text[:250])
  • 。通过检查Response 对象的status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好(顺便说一下,HTTP协议中“OK”的状态码是200。你可能已经熟悉404 状态码,它表示“没找到”)
  • 如果请求成功,下载的页面就作为一个字符串,保存在Response 对象的text变量中

检查错误

  • 。检查成功有一种简单的方法,就是在Response对象上调用raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做。

将下载的文件保存到硬盘

  • 必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为open()的第二参数。
  • 目的是为了保存该文本中的“Unicode 编码”。

BeautifulSoup 模块解析HTML

HTML 创建一个BeautifulSoup 对象

import requests, bs4
res = requests.get('http://nostarch.com')
res.raise_for_status()
noStarchSoup = bs4.BeautifulSoup(res.text)
# 将响应结果的text 属性传递给bs4.BeautifulSoup()
  • 也可以向bs4.BeautifulSoup()传递一个File 对象,从硬盘加载一个HTML 文件
exampleFile = open('example.html')
exampleSoup = bs4.BeautifulSoup(exampleFile)

select()方法寻找元素

传递给 select()方法的选择器 将匹配…
soup.select('div') 所有名为<div>的元素
soup.select('#author') 带有 id 属性为author 的元素
soup.select('.notice') 所有使用CSS class 属性名为notice 的元素
soup.select('div span') 所有在<div>元素之内的<span>元素
soup.select('div > span') 所有直接在

元素之内的<span>元素,中间没有其他元素
soup.select('input[name]') 所有名为<input>,并有一个name 属性,其值无所谓的元素
soup.select('input[type="button"]') 所有名为<input>,并有一个type 属性,其值为button 的元素
  • select()返回一个列表,列表中元素为Tag对象。在该元素上调用getText()方法,返回该元素的文本,或内部的HTML。一个元素的文本是在开始和结束标签之间的内容
  • Tag 对象的get()方法让我们很容易从元素中获取属性值。向该方法传入一个属性名称的字符串,它将返回该属性的值。

selenium 模块控制浏览器

需要安装driver驱动
对于chrome浏览器

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://inventwithpython.com')
# 将浏览器指向该网址

在页面中寻找元素

  • WebDriver 对象有好几种方法,用于在页面中寻找元素。它们被分成find_element_*find_elements_*方法,前者返回一个对象,后者返回一个列表
方法名 返回的WebElement 对象/列表
browser.find_element_by_class_name(name)
browser.find_elements_by_class_name(name)
使用 CSSname 的元素
browser.find_element_by_css_selector(selector)
browser.find_elements_by_css_selector(selector)
匹配 CSS selector 的元素
browser.find_element_by_id(id)
browser.find_elements_by_id(id)
匹配 id 属性值的元素
browser.find_element_by_link_text(text)
browser.find_elements_by_link_text(text)
完全匹配提供的text<a>元素
browser.find_element_by_partial_link_text(text)
browser.find_elements_by_partial_link_text(text)
包含提供的text<a>元素
browser.find_element_by_name(name)
browser.find_elements_by_name(name)
匹配 name 属性值的元素
browser.find_element_by_tag_name(name)
browser.find_elements_by_tag_name(name)
匹配标签name 的元素<br>(大小写无关,<a>元素匹配’a’和’A’)

点击页面

  • find_element_*find_elements_*方法返回的WebElement 对象有一个click()方法,模拟鼠标在该元素上点击
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://inventwithpython.com')
linkElem = browser.find_element_by_link_text('Read It Online')
type(linkElem)
linkElem.click() # follows the "Read It Online" link

填写并提交表单

  • Web 页面的文本字段发送击键,只要找到那个文本字段的<input><textarea>元素,然后调用send_keys()方法。
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://gmail.com')
emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('not_my_real_email@gmail.com')
passwordElem = browser.find_element_by_id('Passwd')
passwordElem.send_keys('12345')
passwordElem.submit()
  • 在任何元素上调用submit()方法,都等同于点击该元素所在表单的Submit 按钮

发送特殊键

  • 这些值保存在selenium.webdriver.common.keys 模块的属性中
属性 含义
Keys.DOWN, Keys.UP, Keys.LEFT,Keys.RIGHT 键盘箭头键
Keys.ENTER, Keys.RETURN 回车和换行键
Keys.HOME, Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP Home 键、End 键、PageUp 键和Page Down 键
Keys.ESCAPE, Keys.BACK_SPACE,Keys.DELETE Esc、 Backspace 和字母键
Keys.F1, Keys.F2, . . . , Keys.F12 键盘顶部的F1 到F12 键
Keys.TAB Tab 键

点击浏览器按钮

browser.back()点击“返回”按钮。
browser.forward()点击“前进”按钮。
browser.refresh()点击“刷新”按钮。
browser.quit()点击“关闭窗口”按钮。

处理Excel 电子表格

openpyxl

处理PDF 和Word 文档

PyPDF2

docx

处理CSV 文件和JSON 数据

csv 模块

json模块

保持时间、计划任务和启动程序

  • timedatetime 模块
  • 利用subprocessthreading 模块,你也可以编程按时启动其他程序

time 模块

time.time()函数

  • Unix 纪元是编程中经常参考的时间:1970 年1 月1 日0 点,即协调世界时(UTC)
  • time.time()函数返回自那一刻以来的秒数,是一个浮点值,这个数字称为UNIX 纪元时间戳
import time
time.time()

time.sleep()函数

  • 暂停程序
  • ,在IDLE 中按Ctrl-C 不会中断time.sleep()调用。IDLE 会等待到暂停结束,再抛出KeyboardInterrupt 异常

datetime 模块

  • datetime 模块有自己的datetime 数据类型。datetime 值表示一个特定的时刻
  • 调用datetime.datetime.now()返回一个datetime 对象,表示当前的日期和时间,根据你的计算机的时钟。这个对象包含当前时刻的年、月、日、时、分、秒和微秒
  • 也可以利用datetime.datetime()函数,向它传入代表年、月、日、时、分、秒的整数,得到特定时刻的datetime 对象。这些整数将保存在datetime 对象的year、month、day、hour、minutesecond属性中。
  • Unix 纪元时间戳可以通过datetime.datetime.fromtimestamp(),转换为datetime对象

timedelta 数据类型

  • datetime 模块还提供了timedelta 数据类型,它表示一段时间,而不是一个时刻。
  • datetime.timedelta()函数接受关键字参数weeks、days、hours、minutes、seconds、milliseconds 和microseconds。没有month 和year 关键字参数,因为“月”和“年”是可变的时间
  • total_seconds()方法返回只以秒表示的时间
  • 算术运算符可以用于对datetime 值进行日期运算
dt = datetime.datetime.now()
thousandDays = datetime.timedelta(days=1000)
dt + thousandDays
# datetime.datetime(2017, 11, 23, 18, 38, 50, 636181)

datetime 对象转换为字符串

  • strftime()
strftime指令 含义,
%Y 带世纪的年份,例如’2014’,
%y 不带世纪的年份,‘00’至’99’(1970 至2069),00’至’99’(1970 至2069)
%m 数字表示的月份,‘01’至’12’,01’至’12’
%B 完整的月份,例如’November’,
%b 简写的月份,例如’Nov’,
%d 一月中的第几天,‘01’至’31’,
%j 一年中的第几天,‘001’至’366’,
%w 一周中的第几天,‘0’(周日)至’6’(周六),
%A 完整的周几,例如’Monday’,
%a 简写的周几,例如’Mon’,
%H 小时(24 小时时钟),‘00’至’23’,
%I 小时(12 小时时钟),‘01’至’12’,
%M 分,‘00’至’59’,
%S 秒,‘00’至’59’,
%p ‘AM’或’PM’,
%% 就是’%'字符,
  • strftime()传入一个定制的格式字符串,其中包含格式化指定(以及任何需要的斜线、冒号等),strftime()将返回一个格式化的字符串,表示datetime 对象的信息。
oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)
oct21st.strftime('%Y/%m/%d %H:%M:%S')
# '2015/10/21 16:29:00'
oct21st.strftime('%I:%M %p')
# '04:29 PM'
oct21st.strftime("%B of '%y")
# "October of '15"

将字符串转换成datetime 对象

datetime.datetime.strptime('October 21, 2015', '%B %d, %Y')
# datetime.datetime(2015, 10, 21, 0, 0)
datetime.datetime.strptime('2015/10/21 16:29:00', '%Y/%m/%d %H:%M:%S')
# datetime.datetime(2015, 10, 21, 16, 29)
datetime.datetime.strptime("October of '15", "%B of '%y")
# datetime.datetime(2015, 10, 1, 0, 0)
datetime.datetime.strptime("November of '63", "%B of '%y")
# datetime.datetime(2063, 11, 1, 0, 0)

多线程

创建一个Thread 对象

import threading
def takeANap():time.sleep(5)print('Wake up!')
threadObj = threading.Thread(target=takeANap)
threadObj.start()

向线程的目标函数传递参数

import threading
threadObj = threading.Thread(target=print, args=['Cats', 'Dogs', 'Frogs'],kwargs={'sep': ' & '})

Python 启动其他程序

  • subprocess 模块
import subprocess
subprocess.Popen('C:\\Windows\\System32\\calc.exe')

Popen对象

  • poll()和wait()
  • 如果这个进程在poll()调用时仍在运行,poll()方法就返回None。如果该程序已经终止,它会返回该进程的整数退出代码。退出代码用于说明进程是无错终止(退出代码为0),还是一个错误导致进程终止(退出代码非零,通常为1,但可能根据程序而不同)。
  • wait()方法将阻塞,直到启动的进程终止

Popen()传递命令行参数

  • Popen()传递一个列表,作为唯一的参数。该列表中的第一个字符串是要启动的程序的可执行文件名,所有后续的字符串将是该程序启动时,传递给该程序的命令行参数。实际上,这个列表将作为被启动程序的sys.argv 的值。
subprocess.Popen(['C:\\Windows\\notepad.exe', 'C:\\hello.txt'])

用默认的应用程序打开文件

  • 根据操作系统,向Popen()传入'start'、'open'或'see',分别代表windows、OS X、Linux
fileObj = open('hello.txt', 'w')
fileObj.write('Hello world!')
# 12
fileObj.close()
import subprocess
subprocess.Popen(['start', 'hello.txt'], shell=True)
# 传入了shell=True 关键字参数,这只在Windows 上需要

发送电子邮件和短信

操 作 图 像

pillow模块

颜色和RGBA

  • RGBA值是一组数字,指定顔色中的**红、绿、蓝和alpha(透明度)**的值。这些值是从0(根本没有)到255(最高)的整数
  • Pillow中,RGBA值表示为四个整数值的元组。例如,红色表示为(255,0,0,255)。这种颜色中红的值为最大,没有绿和蓝,并且alpha值最大,这意味着它完全不透明。
  • 如果颜色的alpha值为0,不论RGB值是什么,该颜色是不可见的
  • Pillow提供ImageColor.getcolor()函数,该函数接受一个颜色名称字符串作为第一个参数,字符串’RGBA’作为第二个参数,返回一个RGBA元组
from PIL import ImageColor
ImageColor.getcolor('red', 'RGBA')
# (255, 0, 0, 255)
ImageColor.getcolor('RED', 'RGBA')
# (255, 0, 0, 255)
ImageColor.getcolor('Black', 'RGBA')
# (0, 0, 0, 255)
ImageColor.getcolor('chocolate', 'RGBA')
# (210, 105, 30, 255)
ImageColor.getcolor('CornflowerBlue', 'RGBA')
# (100, 149, 237, 255)

坐标和Box元组

  • 图像像素用xy坐标指定,分别指定像素在图像中的水平和垂直位置。原点是位于图像左上角的像素,用符号(0,0)指定
  • 许多Pillow函数和方法需要一个矩形元组参数。这意味着Pillow需要一个四个整坐标的元组,表示图像中的一个矩形区域。四个整数按顺序分别是:
    • 左:该矩形的最左边的x坐标
    • 顶:该矩形的顶边的y坐标。
    • 右:该矩形的最右边右面一个像素的x坐标。此整数必须比左边整数大。
    • 底:该矩形的底边下面一个像素的y坐标。此整数必须比顶边整数大。注意,该矩形包括左和顶坐标,直到但不包括右和底坐标。

Pillow操作图像

Image模块

  • Image.open()函数的返回值是Image对象数据类型
from PIL import Image
catIm = Image.open(path)

处理 Image数据类型

from PIL import Image
catIm = Image.open('zophie.png')
catIm.size
# (816, 1088)
width, height = catIm.size
width
# 816
height
# 1088
catIm.filename
# 'zophie.png'
catIm.format
# 'PNG'
catIm.format_description
# 'Portable network graphics'
atIm.save('zophie.jpg')
  • Image.new()函数,它返回一个 Image对象,对象表示空白的图像。
from PIL import Image
im = Image.new('RGBA',(100,200),'purple')
# 100像素宽,200像素高,带有紫色背景
im.save(path)
im2 = Image.new('RGBA',(20,20))
im2.save(path)

裁剪图片

  • Image对象的crop()方法,接受一个元组,返回一个Image对象,表示被裁剪后的图像

复制和粘贴图像到其他图像

catCopy.paste(Image,(x,y))

调整图像大小

  • resize()方法在Image对象上调用,回指定宽度和高度的一个新Image对象,它接受两个整数的元组作为参数,表示返回图像的新高度和宽度。

旋转和翻转图像

  • Image对象的rotate()旋转图像,返回旋转后的新Image对象
catIm.rotate(90).save(path)
# 旋转90°

更改单个像素

im.getpixel((x,y))
im.getpixel((x,y),(R,G,B))

在图像上绘画

  • PillowImageDraw模块
  • ImageDraw对象
from PIL import Image,ImageDraw
im = Image.new(RGBA,(x,y),color)
draw = ImageDraw.Draw(im)
draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], fill='black')

绘制形状

  • 这些方法的filloutline参数是可选的,如果未指定,默认为白色。
形状 函数 注意
point((xy),fill) xy表示x和y坐标的列表,例如[(x,y),(x,y)...][x,y,x,y...]
fill参数是点的颜色,要么是一个RGBA元组,要么是颜色名称的字符串
线 line((xy),fill,width) xy表示x和y坐标的列表,例如[(x,y),(x,y)...][x,y,x,y...]
fill参数是点的颜色,要么是一个RGBA元组,要么是颜色名称的字符串
可选的width参数是线的宽度,如果未指定,缺省值为1
矩形 rectangle((xy),fill,outline) xy参数是一个矩形元组,形式为(left, top, right, bottom)
选的fill参数是颜色,将填充该矩形的内部。可选的outline参数是矩形轮廓的颜色
椭圆 ellipse((xy),fill) xy参数是一个矩形元组(left, top, right, bottom),它表示正好包含该椭圆的矩形。
可选的fill参数是椭圆内的颜色,
可选的outline参数是椭圆轮廓的颜色
多边形 polygon((xy),fill) 同矩形

绘制文本

ImageDraw对象还有text()方法,用于在图像上绘制文本。text()方法有4个参数:xy、text、fill和font

  • xy参数是两个整数的元组,指定文本区域的左上角
  • text参数是想写入的文本字符串
  • 可选参数fill是文本的颜色
  • 可选参数font是一个ImageFont对象,用于设置文本的字体和大小。需要导入ImageFont模块
  • 导入PillowImageFont模块,就可以调用ImageFont.truetype()函数,它有两个参数。第一个参数是字符串,表示字体的TrueType文件,这是硬盘上实际的字体文件
  • 第二个参数是一个整数,表示字体大小的点数(而不是像素)。请记住,Pillow创建的PNG图像默认是每英寸72像素,一点是1/72英寸
from PIL import Image, ImageDraw, ImageFont
import os
im = Image.new('RGBA', (200, 200), 'white')
draw = ImageDraw.Draw(im)
draw.text((20, 150), 'Hello', fill='purple')
fontsFolder = 'FONT_FOLDER' # e.g. ‘/Library/Fonts’
arialFont = ImageFont.truetype(os.path.join(fontsFolder, 'arial.ttf'), 32)
draw.text((100, 150), 'Howdy', fill='gray', font=arialFont)
im.save('text.png')

GUI自动化控制键盘和鼠标

  • pyautogui模块

走对路

通过注销关闭所有程序

  • WindowsLinux上,注销的热键是Ctrl-Alt-Del

暂停和自动防故障装置

  • pyautogui.PAUSE变量设置为要暂停的秒数,每个PyAutoGUI函数调用在执行动作之后,都会等待指定的时间
  • ·pyautogui·也有自动防故障功能。将鼠标移到屏幕的左上角,这将导致pyautogui产生pyautogui .FailSafeException异常
  • 如果你尽可能快地向左上移动鼠标,自动防故障功能都将停止程序;可以设置pyautogui.FAILSAFE = False,禁止这项功能。

控制鼠标移动

  • pyautogui.size()函数返回两个整数的元组,包含屏幕的宽和高的像素数

移动鼠标

  • pyautogui.moveTo(x,y,duration);(x,y)表示移动的目的地位置,可选的duration整数或浮点数关键字参数,指定了将鼠标移动到目的地所需要的秒数
import pyautogui
pyautogui.moveTo(100,100,duration=0.25)
  • pyautogui.moveRel()函数相对于当前的位置移动鼠标
pyautogui.moveRel(100,100,duration=0.25)

获取鼠标位置

  • 通过调用pyautogui.position()函数,可以确定鼠标当前的位置

控制鼠标交互

点击鼠标

  • 鼠标点击pyautogui.click()
pyautogui.click(x,y,botton='left')
pyautogui.click(x,y,botton='middle')
pyautogui.click(x,y,botton='right')
  • pyautogui.mouseDown()按下鼠标按键,不松开
  • pyautogui.mouseUp()松开鼠标按键
  • pyautogui.doubleClick()函数只执行双击鼠标左键。
  • pyautogui.rightClick()pyautogui.middleClick()函数将分别执行双击右键和双击中键

拖动鼠标

  • pyautogui.dragTo()pyautogui.dragRel()(移动到新的位置或者相对当前位置的位置)
  • x坐标/水平移动,y坐标/垂直移动,以及可选的时间间隔

滚动鼠标

  • scroll()滚动发生在鼠标的当前位置。传递正整数表示向上滚动,传递负整数表示向下滚动。

处理屏幕

  • pyautogui拥有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。这些函数也可以返回一个PillowImage对象,包含当前屏幕的内容

获取屏幕快照

import pyautogui
from PIL import Image
im = pyautogui.screenshot()

分析屏幕快照

  • 如果屏幕上指定的x、y坐标处的像素与指定的颜色匹配,PyAutoGUIpixelMatchesColor()函数将返回True

控制键盘

通过键盘发送一个字符串

  • pyautogui.typewrite()函数向计算机发送虚拟按键
pyautogui.typewrite('Helloworld!',0.25)

键名

  • pyautogui.KEYBOARD_KEYS
pyautogui.typewrite(['a', 'b', 'left', 'left', 'X', 'Y'])

按下和释放键盘

  • 就像mouseDown()和mouseUp()函数一样,pyautogui.keyDown()和pyautogui.keyUp()将向计算发送虚拟的按键和释放。同样也有pyautogui.press()函数调用上述两个函数,模拟完整的击键
pyautogui.keyDown('shift'); pyautogui.press('4'); pyautogui.keyUp('shift')

热键组合

pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')
  • 上述操作复杂,可以使用pyautogui.hotkey()`函数,它接受多个键字符串参数,按顺序按下,再按相反的顺序释放
pyautogui.hotkey('ctrl', 'c')

读书笔记————Python编程快速上手相关推荐

  1. Python编程快速上手,让繁琐工作自动化(附下载)

    今天给大家分享一份Python程序员的圣经--<Python编程快速上手:让繁琐工作自动化>.这是本面向实践的Python编程实用指南. 目录 第一章 Python基础 第二章 控制流 第 ...

  2. 一周新书榜:西瓜书伴侣、Python编程快速上手第2版上榜

    3月份的程序员专业书很多,好书也多,上榜书更多,真是万物复苏,好书排排站,刚给大家推荐完Linux新书,又迎来周志华教授"西瓜书"<机器学习>公式完全解析指南的< ...

  3. 导入python标准数学函数模块的语句_《Python编程快速上手——让繁琐工作自动化》——2.8 导入模块...

    本节书摘来自异步社区<Python编程快速上手--让繁琐工作自动化>一书中的第2章,第2.8节,作者[美] Al Sweigart,王海鹏 译,更多章节内容可以访问云栖社区"异步 ...

  4. 《Python编程快速上手——让繁琐工作自动化》——第一部分 Python编程基础 第1章 Python基础 1.1 在交互式环境中输入表达式...

    本节书摘来自异步社区<Python编程快速上手--让繁琐工作自动化>一书中的第1章,第1.1节,作者[美] Al Sweigart,王海鹏 译,更多章节内容可以访问云栖社区"异步 ...

  5. python编程快速上手_给Python小白推荐的40本入门书籍,帮你快速上手

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦! 最近,小编的 Python 交流裙里进来了几位比较特殊的同学:一位初三的以编程为兴 ...

  6. python快速上手 让繁琐工作自动化 英文版_入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码...

    入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...

  7. 《Python编程快速上手 让繁琐工作自动化》pdf

    <div id="article_content" class="article_content tracking-ad" data-mod=" ...

  8. Python程序员的圣经——《Python编程快速上手:让繁琐工作自动化》尾末附下载地址

    一.前言 如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 今天给 ...

  9. python编程快速上手 让繁琐工作自动化 豆瓣_2019年,这些豆瓣评分9.0以上的8本程序员好书你都知道吗?...

    豆瓣这些9.0以上的高评分程序员好书你都知道有哪些吗?小编去豆瓣看了一下,推荐这8本最适用的程序员好书给你. 1.UNIX环境高级编程(第3版)(豆瓣评分9.6)UNIX编程圣经 与Linux相结合的 ...

最新文章

  1. CRF(条件随机场)与Viterbi(维特比)算法原理详解
  2. leetcode.169 求众数
  3. 计算机中的颜色XIII——颜色转换的快速计算公式
  4. Windows 蠕虫首次现身 Mac 电脑:伪装成 Adobe Flash 软件
  5. Zookeeper-Zookeeper的配置
  6. 台达plc控制伺服电机编程实例_PLC控制伺服电机:控制脉冲的相关计算
  7. 节点树xmu 1466.祖先极值
  8. 调试maven源代码
  9. MyEclipse打开闪退
  10. 详细解读Spark的数据分析引擎:Spark SQL
  11. 原生js的ajax的get怎么传参,原生js---ajax---get方法传数据
  12. 深入理解计算机系统(1.3)------操作系统的抽象概念
  13. 几种常用 css3 选择器解释
  14. 其他电脑连接本地mysql数据库_在局域网内,如何让其他电脑连接我们自己的本地mysql数据库...
  15. php网页背景音乐代码,HTML5背景音乐播放器代码
  16. python语言绘制词云图
  17. C/C++编程笔记:C++中的atol(),atoll()和atof()函数
  18. 水利知识库AI助手+公务员资料【产品经理】
  19. 哪个网站可以免费学计算机办公软件,有没有可以免费学习办公软件的网站?
  20. html中评论的星星怎么写,css 评分效果的星星示例

热门文章

  1. 最好的编程语言(如何不再担忧,爱上代码)
  2. 我的 2020 年终总结 - 成长不及预期的 3 年之痒
  3. Burpsuite插件 reCAPTCHA识别验证码
  4. opencc在linux环境中,android-opencc,中文简繁转换项目OpenCC的安卓版
  5. python系统学习日记 L32 循环和列表
  6. YOLOV3学习笔记(噼里啪啦up主)
  7. Python制作简单的终端交互小游戏
  8. 计算机对油画发展的影响,论当代中国油画多元化的发展,社会变化对油画多元化进一步影响!...
  9. 设计模式中的结构类模式
  10. STM32 internal command error 问题