AutomateTheBoringStuffWithPython
第一部分 Python編程基礎
第 1 章 Python 基礎
1.1 在交互式環境中輸入表達式
| 操作 | 指數 | 取模/取余數 | 整除/商數取整 | 除 | 乘 | 減 | 加 |
| spam += 1 | spam = spam + 1 |
| spam -= 1 | spam = spam - 1 |
| spam *= 1 | spam = spam * 1 |
| spam /= 1 | spam = spam / 1 |
| spam %= 1 | spam = spam % 1 |
1.2 整型、浮點型和字符串數據類型
int float char
1.3 字符串連接和復制
連接:+
>>>'Hello' + ',' + 'World' 'Hello,World'復制:*
>>>'hello' * 3 hellohellohello1.4 在變量中保存值
1.4.1 賦值語句
賦值語句包含一個變量名、一個等號(稱為賦值操作符),以及要存儲的值。
>>>apple = 520 >>>apple 520 >>>apple=apple + 1 >>>apple 5211.4.2 變量名
1.只能是一個詞。
2.只能包含字母、數字和下劃線。
3.不能以數字開頭。
1.5 程序剖析
# This is annotation. This program says hello and asks for my name. print('Hello world!') # print()函數將括號內的字符串顯示在屏幕上。 print('What is your name?') # ask for their name myName = input() print('It is good to meet you, ' + myName) # 打印用戶名字 print('The length of your name is:') print(len(myName)) print('What is your age?') # ask for their age myAge = input() # 函數等待用戶在鍵盤上輸入一些文本,并按下回車鍵。 print('You will be ' + str(int(myAge) + 1) + ' in a year.')第 2 章 控制流
2.1 操作符類型
| Boolean(布爾)值 | True、False |
| 比較操作符 | ==、!=、<、>、<=、>= |
| 布爾操作符 | and、or、not |
2.2 控制流的元素
2.2.1 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.')2.2.2 while 循環語句
在代碼中,while 語句總是包含下面幾部分:
- 關鍵字;
- 條件(求值為 True 或 False 的表達式);
- 冒號;
- 從新行開始,縮進的代碼塊(稱為 while 子句)。
2.2.2.1 break語句
# 讓執行提前跳出 while 循環子句 while True:print('Please type your name.')name = input() if name == 'your name': break print('Thank you!')2.2.2.2 continue語句
# 像 break 語句一樣,continue 語句用于循環內部。如果程序執行遇到 continue 語句,就會馬上跳回到循環開始處,重新對循環條件求值 while True:print('Who are you?')name = input()if name != 'Joe': continue print('Hello, Joe. What is the password? (It is a fish.)') password = input() if password == 'swordfish':break print('Access granted.')2.2.3 for 循環語句
在代碼中,for 語句總是包含以下部分:
- for 關鍵字;
- 一個變量名;
- in 關鍵字;
- 調用 range()方法,最多傳入 3 個參數;
- 冒號;
- 從下一行開始,縮退的代碼塊(稱為 for 子句)。
2.4 導入模塊
在開始使用一個模塊中的函數之前,必須用 import 語句導入該模塊。在代碼中,
import 語句包含以下部分:
- import 關鍵字;
- 模塊的名稱;
- 可選的更多模塊名稱,之間用逗號隔開。
from import 語句包含以下部分
- from關鍵字;
- 模塊的名稱;
- import關鍵字和一個*。
使用這種形式的 import 語句,調用 random模塊中的函數時不需要 random.前綴。但是,使用完整的名稱會讓代碼更可讀,所以最好是使用普通形式的 import 語句。
2.5 用 sys.exit()提前結束程序
當程序執行到指令的底部時,總是會終止。但是,通過調用 sys.exit()函數,可以讓程序終止或退出。因為這個函數在 sys 模塊中,所以必須先導入 sys,才能使用它。
import sys while True:print('Type exit to exit.')response = input()if response == 'exit':sys.exit() print('You typed ' + response + '.')第 3 章 函數
3.1 def 語句和return語句
import random def getAnswer(answerNumber):if answerNumber == 1: return 'apple' elif answerNumber == 2:return 'egg' elif answerNumber == 3 or answerNumber == 4:return 'Yes' elif answerNumber == 5:print('hello, ', end = '')print('world')return 'hello, world'elif answerNumber == 6:print('hello,')print('world')return 'hello, \nworld'else:return None # NoneType for i in range(1, 11):print(getAnswer(random.randint(1, 9)))print('\n\n')3.2 局部和全局作用域
在被調用函數內賦值的變元和變量,處于該函數的“局部作用域”。在所有函數之外賦值的變量,屬于“全局作用域”。處于局部作用域的變量,被稱為“局部變量”。處于全局作用域的變量,被稱為“全局變量”。一個變量必是其中一種,不能既是局部的又是全局的。
作用域很重要,理由如下:
-
全局作用域中的代碼不能使用任何局部變量;
def sum(i):other = 2return i + other print(sum(1)) print(other)========================= RESTART: M:/python/test003.py ======================== 3 Traceback (most recent call last):File "M:/python/test003.py", line 5, in <module>print(other) NameError: name 'other' is not defined -
但是,局部作用域可以訪問全局變量;
-
一個函數的局部作用域中的代碼,不能使用其他局部作用域中的變量。
def one():a = 1print(a)def two():b = 2one()print(b)print(b + a)two()========================= RESTART: M:/python/test004.py ======================== 1 2 Traceback (most recent call last):File "M:/python/test004.py", line 11, in <module>two()File "M:/python/test004.py", line 9, in twoprint(b + a) NameError: name 'a' is not defined def one():a = 1print(a)def two():b = 2one()print(b)two()========================= RESTART: M:/python/test004.py ======================== 1 2 -
(盡量避免)如果在不同的作用域中,你可以用相同的名字命名不同的變量。也就是說,可以有一個名為 one 的局部變量,和一個名為 one 的全局變量。
def test1():one = 'local1' print(one) # prints 'local1' def test2():one = 'local2' print(one) # prints 'local2'test1()print(one) # prints 'local2' one = 'global' test2() print(one) # prints 'global'========================= RESTART: M:\python\test005.py ======================== local2 local1 local2 global -
全局變量可以在局部作用域中讀取
def test():print(eggs) eggs = 42 test() print(eggs) -
global 語句
def localProcess():global appleapple = 520 apple = 1314 localProcess() print(apple)========================= RESTART: M:\python\test006.py ======================== 520
3.3 異常處理
到目前為止,在 Python 程序中遇到錯誤,或“異常”,意味著整個程序崩潰。錯誤可以由 try 和 except 語句來處理。那些可能出錯的語句被放在 try 子句中。如果錯誤發生,程序執行就轉到接下來的 except 子句開始處。
def test(divideBy):try:return 42 / divideBy except ZeroDivisionError:print('Error: Invalid argument.') print(test(2)) print(test(12)) print(test(0)) print(test(1))========================= RESTART: M:\python\test007.py ======================== 21.0 3.5 Error: Invalid argument. None 42.0第 4 章 列表、字符串、元組
4.1 列表數據類型
“列表”是一個值,它包含多個字構成的序列。術語“列表值”指的是列表本身(它作為一個值,可以保存在變量中,或傳遞給函數,像所有其他值一樣),而不是指列表值之內的那些值。列表中的值也稱為“表項”。表項用逗號分隔,以方括號結束。
test = ['cat', 'bat', 'rat', 'elephant']# 用下標取得列表中的單個值 test[0] # 'cat' test[3] # 'elephant' test[4] # IndexError test[0.5] # TypeError# 負數下標 test[-1] # 'elelhant' test[-4] # 'cat'# 利用切片取得子列表 [,) test[0:2] # ['cat', 'bat'] test[0:-1] # ['cat', 'bat', 'rat'] spam[1:] # ['bat', 'rat', 'elephant'] spam[:] # ['cat', 'bat', 'rat', 'elephant']# 用 len()取得列表的長度 len(test) # 4# 用下標改變列表中的值 test[0] = 'apple' test # ['apple', 'bat', 'rat', 'eleplant']# 列表連接和列表復制 add = ['add'] total = test + add total # ['apple', 'bat', 'rat', 'eleplant', 'add'] add * 3 # ['add', 'add', 'add']# 用 del 語句從列表中刪除值 del total[4] total == test # true4.2 使用列表
當你第一次開始編程時,很容易會創建許多獨立的變量,來保存一組類似的值。實際上,不必使用多個重復的變量,你可以使用單個變量,包含一個列表值。
catNames = [] while True:print('Enter the name of cat ' + str(len(catNames) + 1) + ' (Or enter nothing to stop.):') name = input()if name == '':break catNames = catNames + [name] # list concatenation print('The cat names are:') for name in catNames:print(' ' + name)# 列表用于循環 for i in range(len(catNames)):print('Index ' + str(i) + ' in catNames is: ' + catNames[i])# in 和 not in 操作符 'AAA' in catNames 'AAA' not in catNames# 多重賦值 cat = ['fat', 'black', 'loud'] size, color, disposition = cat# 增強賦值 cat += 'rap' cat # ['fat', 'black', 'loud', 'rap']變量的數目和列表的長度必須嚴格相等,否則 Python 將給出 ValueError
4.3 方法
方法和函數是一回事,只是它是調用在一個值上。方法部分跟在這個值后面,以一個句點分隔。每種數據類型都有它自己的一組方法。例如,列表數據類型有一些有用的方法,用來查找index、添加append/insert、刪除remove/del或操作sort列表中的值。
# 用 index()方法在列表中查找值 test = ['aa', 'bb', 'cc', 'cc'] test.index['aa'] # 0 test.index['cc'] # 2 test.index['dd'] # ValueRError# 用 append()和 insert()方法在列表中添加值 test.append('ee') test # ['aa', 'bb', 'cc', 'cc', 'ee']test.insert(0, '00') test # ['00', 'aa', 'bb', 'cc', 'cc', 'ee']# 用 remove()方法從列表中刪除值 test.remove('00') test # ['aa', 'bb', 'cc', 'cc', 'ee'] test.remove('00') # ValueErrortest.remove('cc') test # ['aa', 'bb', 'cc', 'ee'] remove the first# 用 del()方法從列表中刪除值 del(test[0]) test # ['bb', 'cc', 'ee']# 用 sort()方法將列表中的值按 ASCII 字符順序排序 test.sort(reverse=True) # 逆序 test # ['ee', 'cc', 'bb'] test.sort() # 順序 test # ['bb', 'cc', 'ee']test0 = [1, 2, 3, 'a', 'b', 'c'] # 對既有數字又有字符串值的列表 test.sort() # TypeError# 按照普通的字典順序排序 test1 = ['a', 'x', 'B', 'M'] test1.sort() test1 # ['B', 'M', 'a', 'x'] test1.sort(key=str.lower) test1 # ['a', 'B', 'M', 'x']4.4 字符串
列表并不是唯一表示序列值的數據類型。例如,字符串和列表實際上很相似,只要你認為字符串是單個文本字符的列表。對列表的許多操作,也可以作用于字符串:按下標取值、切片、用于 for 循環、用于 len(),以及用于 in 和 not in 操作符。
>>> name = 'Zophie' >>> name[0] 'Z' >>> name[-2] 'i' >>> name[0:4] 'Zoph' >>> 'Zo' in name True >>> 'z' in name False >>> 'p' not in name False >>> for i in name:print('* * * ' + i + ' * * *') * * * Z * * * * * * o * * * * * * p * * * * * * h * * * * * * i * * * * * * e * * *但列表和字符串在一個重要的方面是不同的。**列表是“可變的”數據類型,它的值可以添加、刪除或改變。 ** 但是,字符串是“不可變的”,它不能被更改。 嘗試對字符串中的一個字符重新賦值,將導致 TypeError 錯誤。
>>> name = 'Zophie a cat' >>> name[7] = 'the' Traceback (most recent call last):File "<pyshell#50>", line 1, in <module>name[7] = 'the' TypeError: 'str' object does not support item assignment>>> name = 'Zophie a cat' >>> newName = name[0:7] + 'the' + name[8:12] >>> name 'Zophie a cat' >>> newName 'Zophie the cat'4.5 元組
除了兩個方面,“元組”數據類型幾乎與列表數據類型一樣。首先,元組輸入時用圓括號(),而不是用方括號[]。但元組與列表的主要區別還在于,元組像字符串一樣,是不可變的。元組不能讓它們的值被修改、添加或刪除。
>>> eggs = ('hello', 42, 0.5) >>> eggs[0] 'hello' >>> eggs[1:3] (42, 0.5) >>> len(eggs) 3如果元組中只有一個值,你可以在括號內該值的后面跟上一個逗號,表明這種情況。
>>> type(('hello',)) <class 'tuple'> >>> type(('hello')) <class 'str'>你可以用元組告訴所有讀代碼的人,你不打算改變這個序列的值。如果需要一個永遠不會改變的值的序列,就使用元組。使用元組而不是列表的第二個好處在于,因為它們是不可變的,它們的內容不會變化,Python 可以實現一些優化,讓使用元組的代碼比使用列表的代碼更快。
4.6 類型轉換與引用
4.6.1 類型轉換
函數 str()、 list()、 tuple()將返回傳遞給它們的值的字符串、列表、元組版本。
4.6.2 引用
變量保存字符串或整數值,如將 42 賦給 spam 變量,然后拷貝 spam 中的值,將它賦給變量 cheese。當稍后將 spam 中的值改變為 100 時,這不會影響 cheese 中的值。這是因為 spam 和 heese是不同的變量,保存了不同的值。
>>> spam = 42 >>> cheese = spam >>> spam = 100 >>> spam 100 >>> cheese 42但列表不是這樣的。當你將列表賦給一個變量時,實際上是將列表的“引用”賦給了該變量。引用是一個值,指向某些數據。列表引用是指向一個列表的值。
>>> spam = [0, 1, 2, 3, 4, 5] >>> cheese = spam >>> cheese[1] = 'Hello!' >>> spam [0, 'Hello!', 2, 3, 4, 5] >>> cheese [0, 'Hello!', 2, 3, 4, 5]4.6.2.1 傳遞引用
def eggs(someParameter):someParameter.append('Hello') spam = [1, 2, 3] eggs(spam) print(spam)4.6.2.2 copy 模塊的 copy()和deepcopy()函數
>>> import copy >>> spam = ['A', 'B', 'C', 'D'] >>> cheese = copy.copy(spam) >>> cheese[1] = 42 >>> spam ['A', 'B', 'C', 'D'] >>> cheese ['A', 42, 'C', 'D']如果要復制的列表中包含了列表,那就使用 copy.deepcopy()函數來代替。deepcopy()函數將同時復制它們內部的列表。
第 5 章 字典和結構化數據
5.1 字典數據類型
像列表一樣,“字典”是許多值的集合。但不像列表的下標,字典的索引可以使用許多不同數據類型,不只是整數。字典不是只能使用整數下標,而是可以用各種數據類型作為鍵:整型、浮點型、字符串或元組。 字典的索引被稱為“鍵”,鍵及其關聯的值稱為“鍵-值”對。在代碼中,字典輸入時帶花括號{}。字典方法**keys()、values()和 items()**將返回類似列表的值,分別對應于字典的鍵、值和鍵-值對。這些數據類型(分別是 dict_keys、dict_values 和 dict_items)可以用于for 循環。
>>> myCat = {'size': 'fat', 'color': 'gray'} >>> myCat['size'] 'fat' >>> 'My cat has ' + myCat['color'] + ' fur.' 'My cat has gray fur.'>>> for k in myCat.keys():print(k) size color >>> for i in myCat.items():print(i) ('size', 'fat') ('color', 'gray')# 檢查字典中是否存在鍵或值' >>> 'color' in myCat True >>> 'gray' not in myCat.keys() False# get() >>> 'This is a ' + str(myCat.get('color', 0)) + ' cat' 'This is a gray cat'# setdefault() -> 為字典中某個鍵設置一個默認值,當該鍵沒有任何值時使用它 >>> myCat.setdefault('name', 'Tony') 'Tony' >>> myCat {'size': 'fat', 'color': 'gray', 'name': 'Tony'} >>> myCat.setdefault('color', 'white') 'gray' >>> myCat {'size': 'fat', 'color': 'gray', 'name': 'Tony'}5.2 漂亮打印
import pprint message = 'It was a bright cold day in April, and the clocks were striking thirteen.' count = {}for character in message:count.setdefault(character, 0)count[character] = count[character] + 1# 顯示在屏幕上 pprint.pprint(count) # (1) print(pprint.pformat(myCat)) # (2)# 得到漂亮打印的文本作為字符串 pprint.pformat(myCat)5.3 使用數據結構對真實世界建模
5.3.1 井字棋盤.88
5.3.2 嵌套的字典和列表91
5.4 小結92
5.5 習題93
5.6 實踐項目 93
5.6.1 好玩游戲的物品清單93
5.6.2 列表到字典的函數,針對
好玩游戲物品清單94
第 6 章 字符串操作
6.1 處理字符串
>>> myCat = "Tis is Tony's cat" # 雙引號中可使用單引號 >>> myCat "Tis is Tony's cat" >>> myCat = 'This is Tony\'s cat' # 轉義字符 倒斜杠\ >>> myCat "Tis is Tony's cat" >>> myCat = r'This is Tony\'s cat' # 原始字符串 >>> myCat "This is Tony\\'s cat"# 用三重引號的多行字符串 # 多行注釋 “”“This is a letter to my son. Please send to he. ”“”>>> print('''Dear Son,Nice to meet you! Yours trutly Tiny''') Dear Son,Nice to meet you! Yours trutly Tiny# 字符串下標和切片 >>> helloWorld = 'Hello World' >>> helloWorld[:] 'Hello World' >>> len(helloWorld) 11 >>> helloWorld[0:6] 'Hello ' >>> helloWorld[5:] ' World' >>> fizz = helloWorld[4:10] >>> fizz = helloWorld[4:10] >>> fizz 'o Worl'# 字符串的 in 和 not in 操作符 >>> 'hello' in helloWorld False >>> 'Hello' in helloWorld True >>> 'world' not in helloWorld True6.2 有用的字符串方法
6.2.1 字符串方法 upper()、lower()、isX()
test = 'Hello, World!' >>> test.upper() 'HELLO, WORLD!' >>> test.lower() 'hello, world!' >>> test 'Hello, World!' >>> test.isupper() False >>> test.islower() False>>> 'abcd'.isalpha() # 只包含字母,并且非空 True >>> 'hello123'.isalnum() # 只包含字母和數字,并且非空 False >>> ' \t\n'.isspace() # 只包含空格、制表符和換行,并且非空 True >>> '123'.isdecimal() # 只包含數字字符,并且非空 False >>> 'This is a cat' # 僅包含以大寫字母開頭、后面都是小寫字母的單詞 True6.2.2 字符串方法 startswith()和endswith()
如果它們所調用的字符串以該方法傳入的字符串開始或結束,startswith()和 endswith()方法返回 True。否則,方法返回 False。
>>> 'Hello world!'.startswith('Hello') True >>> 'Hello world!'.endswith('world!') True >>> 'abc123'.startswith('abcdef') False >>> 'abc123'.endswith('12') False >>> 'Hello world!'.startswith('Hello world!') True >>> 'Hello world!'.endswith('Hello world!') True6.2.3 字符串方法 join()和split()
>>> ' '.join(['My', 'name', 'is', 'Tony']) 'My name is Tony' >>> letter = ('''Dear Son,Nice to meet you! Yours trutly Tiny''') >>> letter.split('\n') ['Dear Son,', '\tNice to meet you!', 'Yours trutly', 'Tiny']6.2.4 用 rjust()、ljust()和 center()方法對齊文本
rjust()和 ljust()字符串方法返回調用它們的字符串的填充版本,通過插入填充字符來對齊文本。center()字符串方法與 ljust()與 rjust()類似,但它讓文本居中,而不是左對齊或右對齊。
>>> 'hello'.rjust(10, '*') '*****hello' >>> 'hello'.ljust(10, '*') 'hello*****' >>> 'hello'.center(11, '*') '***hello***'6.2.5 用 strip()、rstrip()和 lstrip()刪除空白字符
>>> test = ' hello world ' >>> test.strip() 'hello world' >>> test.lstrip() 'hello world ' >>> test.rstrip() ' hello world' >>> test.strip(' hdl') 'ello wor' >>> test.rstrip(' hdl') ' hello wor' >>> test.lstrip(' hdl') 'ello world '6.2.6 用 pyperclip 模塊拷貝copy()粘貼paste()字符串
>>> import pyperclip >>> pyperclip.copy('Hello world!') >>> pyperclip.paste() 'Hello world!'6.3 項目:口令保管箱
第 1 步:程序設計和數據結構
第 2 步:處理命令行參數
第 3 步:復制正確的口令
6.4 項目:在 Wiki 標記中添加無序列表
第 1 步:從剪貼板中復制和粘貼
第 2 步:分離文本中的行,并添加星號
第 3 步:連接修改過的行
第二部分 自動化任務
第 7 章 模式匹配與正則表達式
7.1 不用正則表達式來查找文本模式
def isPhoneNumber(text):if len(text) != 13: return False for i in range(0, 3):if not text[i].isdecimal(): return Falseif text[3] != '-':return False for i in range(4, 8): if not text[i].isdecimal(): return Falseif text[8] != '-':return False for i in range(9, 13):if not text[i].isdecimal(): return Falsereturn True print('151-8674-4242 is a phone number:') print(isPhoneNumber('151-8674-4242'))7.2 用正則表達式(regex)查找文本模式
# 1.創建正則表達式對象 import re phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')# 2.匹配 Regex 對象 mo = phoneNumRegex.search('My number is 151-8674-4242.') print('Phone number found: ' + mo.group()) ## Phone number found: 151-8674-4242# 利用括號分組 phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d\d)-(\d\d\d\d)') mo = phoneNumRegex.search('My number is 151-8674-4242.') mo.groups() # ('151', '8674', '4242') mo.groups(0) # '151-8674-4242' mo.groups(1) # '151'# 用管道匹配多個分組 testRegex = re.compile(r'good|bad') mo = testRegex.search('Today is good, though yesterday was bad') mo.group() # 'good'mo = testRegex.search('Though yesterday was bad, today is good') mo.group() # 'bad'testRegex = re.compile(r'(goo|ba)d') mo = testRegex.search('Today is good, though yesterday was bad') mo.group() # 'good' mo.group(1) # 'goo'# 用問號實現可選匹配# 用星號匹配零次或多次# 用加號匹配一次或多次# 用花括號匹配特定次數7.4 貪心和非貪心匹配123
7.5 findall()方法124
7.6 字符分類 .124
7.7 建立自己的字符分類 .125
7.8 插入字符和美元字符 .126
7.9 通配字符 .126
7.9.1 用點-星匹配所有字符127
7.9.2 用句點字符匹配換行127
7.10 正則表達式符號復習 128
7.11 不區分大小寫的匹配128
7.12 用 sub()方法替換字符串.129
7.13 管理復雜的正則表達式129
7.14 組合使用 re.IGNOREC ASE、
re.DOTALL 和re.VERBOSE130
7.15 項目:電話號碼和 E-mail 地址提取程序130
第 1 步:為電話號碼創建一個正則表達式131
第 2 步:為 E-mail 地址創建一個正則表達式132
第 3 步:在剪貼板文本中找到所有匹配132
第 4 步:所有匹配連接成一個字符串,復制到剪貼板133
第 5 步:運行程序133
第 6 步:類似程序的構想.134
第 8 章 讀寫文件
8.1 文件與文件路徑 137
8.1.1 Windows 上的倒斜杠以及OS X 和 Linux 上的正斜杠
8.1.2 當前工作目錄
8.1.3 絕對路徑與相對路徑
8.1.4 用 os.makedirs()創建新文件夾
8.1.5 os.path 模塊
8.1.6 處理絕對路徑和相對路徑
8.1.7 查看文件大小和文件夾內容
8.1.8 檢查路徑有效性 .143
8.2 文件讀寫過程 144
8.2.1 用 open()函數打開文件145
8.2.2 讀取文件內容 145
8.2.3 寫入文件 146
8.3 用 shelve 模塊保存變量 147
8.4 用 pprint.pformat()函數保存
變量 148
8.5 項目:生成隨機的測驗試卷
文件 149
第 1 步:將測驗數據保存在一個
字典中 149
第 2 步:創建測驗文件,并打亂
問題的次序 150
第 3 步:創建答案選項 .151
第 4 步:將內容寫入測驗試卷和
答案文件 151
8.6 項目:多重剪貼板 153歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
第 1 步:注釋和 shelf 設置 153
第 2 步:用一個關鍵字保存剪貼板
內容154
第 3 步:列出關鍵字和加載關鍵字的
內容.154
8.7 小結155
8.8 習題155
8.9 實踐項目 .156
8.9.1 擴展多重剪貼板.156
8.9.2 瘋狂填詞156
8.9.3 正則表達式查找.156
第 9 章 組織文件
9.1 shutil 模塊 158
9.1.1 復制文件和文件夾.158
9.1.2 文件和文件夾的移動與
改名158
9.1.3 永久刪除文件和文件夾160
9.1.4 用 send2trash 模塊安全地
刪除160
9.2 遍歷目錄樹.161
9.3 用 zipfile 模塊壓縮文件.162
9.3.1 讀取 ZIP 文件163
9.3.2 從 ZIP 文件中解壓縮164
9.3.3 創建和添加到 ZIP 文件164
9.4 項目:將帶有美國風格日期的
文件改名為歐洲風格日期165
第 1 步:為美國風格的日期創建一個
正則表達式165
第 2 步:識別文件名中的日期
部分166
第 3 步:構成新文件名,并對文件
改名167
第 4 步:類似程序的想法.168
9.5 項目:將一個文件夾備份到一個
ZIP 文件168
第 1 步:弄清楚 ZIP 文件的
名稱 168
第 2 步:創建新 ZIP 文件 .169
第 3 步:遍歷目錄樹并添加到
ZIP 文件 170
第 4 步:類似程序的想法 .170
9.6 小結 171
9.7 習題 171
9.8 實踐項目. 171
9.8.1 選擇性拷貝 171
9.8.2 刪除不需要的文件 .172
9.8.3 消除缺失的編號 .172
第 10 章 調試
10.1 拋出異常 174
10.2 取得反向跟蹤的字符串 . 175
10.3 斷言 176
10.3.1 在交通燈模擬中使用
斷言 177
10.3.2 禁用斷言 .178
10.4 日志 178
10.4.1 使用日志模塊 178
10.4.2 不要用 print()調試180
10.4.3 日志級別 .180
10.4.4 禁用日志 .181
10.4.5 將日志記錄到文件 182
10.5 IDLE 的調試器 182
10.5.1 Go .183
10.5.2 Step 183
10.5.3 Over 183
10.5.4 Out 183
10.5.5 Quit 183
10.5.6 調試一個數字相加的
程序 184
10.5.7 斷點 185
10.6 小結 187歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
10.7 習題.187
10.8 實踐項目188
第 11 章 從 Web 抓取信息
11.1 項目:利用 webbrowser 模塊的
mapIt.py .190
第 1 步:弄清楚 URL.190
第 2 步:處理命令行參數.191
第 3 步:處理剪貼板內容,加載
瀏覽器191
第 4 步:類似程序的想法.192
11.2 用 requests 模塊從 Web 下載
文件.192
11.2.1 用 requests.get()函數下載
一個網頁.193
11.2.2 檢查錯誤.193
11.3 將下載的文件保存到硬盤194
11.4 HTML .195
11.4.1 學習 HTML 的資源.195
11.4.2 快速復習.195
11.4.3 查看網頁的 HTML
源代碼.196
11.4.4 打開瀏覽器的開發者
工具197
11.4.5 使用開發者工具來尋找
HTML 元素198
11.5 用 BeautifulSoup 模塊解析
HTML.199
11.5.1 從 HTML 創建一個
BeautifulSoup 對象200
11.5.2 用select()方法尋找元素.200
11.5.3 通過元素的屬性獲取
數據202
11.6 項目:“I’m Feeling Lucky”
Google 查找.202
第1步:獲取命令行參數,并請求
查找頁面 203
第2步:找到所有的結果 .203
第 3 步:針對每個結果打開 Web
瀏覽器 204
第 4 步:類似程序的想法 .205
11.7 項目:下載所有 XKCD
漫畫 205
第 1 步:設計程序 206
第 2 步:下載網頁 207
第 3 步:尋找和下載漫畫圖像207
第 4 步:保存圖像,找到前一張
漫畫 208
第 5 步:類似程序的想法 .209
11.8 用 selenium 模塊控制瀏覽器 210
11.8.1 啟動 selenium 控制的
瀏覽器 .210
11.8.2 在頁面中尋找元素211
11.8.3 點擊頁面 .212
11.8.4 填寫并提交表單212
11.8.5 發送特殊鍵 213
11.8.6 點擊瀏覽器按鈕213
11.8.7 關于 selenium 的更多
信息 214
11.9 小結 214
11.10 習題 214
11.11 實踐項目. 215
11.11.1 命令行郵件程序215
11.11.2 圖像網站下載215
11.11.3 2048.215
11.11.4 鏈接驗證215
第 12 章 處理 Excel 電子表格
12.1 Excel 文檔 217
12.2 安裝 openpyxl 模塊 218
12.3 讀取 Excel 文檔. 218
12.3.1 用 openpyxl 模塊打開 Excel歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
文檔219
12.3.2 從工作簿中取得工作表.219
12.3.3 從表中取得單元格220
12.3.4 列字母和數字之間的
轉換221
12.3.5 從表中取得行和列222
12.3.6 工作簿、工作表、
單元格.223
12.4 項目:從電子表格中讀取
數據.223
第 1 步:讀取電子表格數據224
第 2 步:填充數據結構.225
第 3 步:將結果寫入文件.226
第 4 步:類似程序的思想.227
12.5 寫入 Excel 文檔227
12.5.1 創建并保存 Excel 文檔.227
12.5.2 創建和刪除工作表228
12.5.3 將值寫入單元格229
12.6 項目:更新一個電子表格229
第 1 步:利用更新信息建立數據
結構230
第 2 步:檢查所有行,更新不正確的
價格231
第 3 步:類似程序的思想.231
12.7 設置單元格的字體風格232
12.8 Font 對象232
12.9 公式.234
12.10 調整行和列235
12.10.1 設置行高和列寬.235
12.10.2 合并和拆分單元格236
12.10.3 凍結窗格237
12.10.4 圖表238
12.11 小結240
12.12 習題 240
12.13 實踐項目.241
12.13.1 乘法表241
12.13.2 空行插入程序 .241
12.13.3 電子表格單元格翻轉
程序 242
12.13.4 文本文件到電子表格242
12.13.5 電子表格到文本文件242
第 13 章 處理 PDF 和 Word 文檔
13.1 PDF 文檔 243
13.1.1 從 PDF 提取文本244
13.1.2 解密 PDF.245
13.1.3 創建 PDF.246
13.1.4 拷貝頁面 .246
13.1.5 旋轉頁面 .247
13.1.6 疊加頁面 .248
13.1.7 加密 PDF.249
13.2 項目:從多個 PDF 中合并
選擇的頁面. 250
第 1 步:找到所有 PDF 文件250
第 2 步:打開每個 PDF 文件251
第 3 步:添加每一頁 252
第 4 步:保存結果 252
第 5 步:類似程序的想法 .253
13.3 Word 文檔. 253
13.3.1 讀取 Word 文檔.254
13.3.2 從.docx 文件中取得完整的
文本 254
13.3.3 設置 Paragraph 和 Run 對象
的樣式 .255
13.3.4 創建帶有非默認樣式的
Word 文檔257
13.3.5 Run 屬性257
13.3.6 寫入 Word 文檔.258
13.3.7 添加標題 .260
13.3.8 添加換行符和換頁符 261
13.3.9 添加圖像 .261
13.4 小結 262歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
13.5 習題.262
13.6 實踐項目263
13.6.1 PDF 偏執狂263
13.6.2 定制邀請函,保存為 Word
文檔263
13.6.3 暴力 PDF 口令破解
程序264
第 14 章 處理 CSV 文件和 JSON 數據.265
14.1 csv 模塊.265
14.1.1 Reader 對象266
14.1.2 在 for 循環中,從 Reader
對象讀取數據267
14.1.3 Writer 對象.268
14.1.4 delimiter 和 lineterminator
關鍵字參數269
14.2 項目:從 CSV 文件中刪除
表頭 269
第 1 步:循環遍歷每個 CSV
文件270
第 2 步:讀入 CSV 文件 270
第 3 步:寫入 CSV 文件,沒有
第一行271
第 4 步:類似程序的想法.272
14.3 JSON 和 API272
14.4 json 模塊273
14.4.1 用 loads()函數讀取
JSON 273
14.4.2 用 dumps 函數寫出
JSON 273
14.5 項目:取得當前的天氣數據274
第 1 步:從命令行參數獲取
位置274
第 2 步:下載 JSON 數據275
第 3 步:加載 JSON 數據并打印
天氣275
第 4 步:類似程序的想法 .277
14.6 小結 277
14.7 習題 277
14.8 實踐項目 277
第 15 章 保持時間、計劃任務和啟動
程序 279
15.1 time 模塊 279
15.1.1 time.time()函數 .279
15.1.2 time.sleep()函數 280
15.2 數字四舍五入. 281
15.3 項目:超級秒表 282
第 1 步:設置程序來記錄時間282
第 2 步:記錄并打印單圈時間283
第 3 步:類似程序的想法 .283
15.4 datetime 模塊 284
15.4.1 timedelta 數據類型285
15.4.2 暫停直至特定日期 286
15.4.3 將 datetime 對象轉換為
字符串 .287
15.4.4 將字符串轉換成 datetime
對象 288
15.5 回顧 Python 的時間函數 288
15.6 多線程 289
15.6.1 向線程的目標函數傳遞
參數 290
15.6.2 并發問題 .291
15.7 項目:多線程 XKCD 下載
程序 291
第 1 步:修改程序以使用函數292
第 2 步:創建并啟動線程 .293
第 3 步:等待所有線程結束 293
15.8 從 Python 啟動其他程序 294
15.8.1 向 Popen()傳遞命令行
參數 295
15.8.2 Task Scheduler、launchd 和歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
cron 296
15.8.3 用 Python 打開網站.296
15.8.4 運行其他 Python 腳本.296
15.8.5 用默認的應用程序打開
文件297
15.9 項目:簡單的倒計時程序298
第 1 步:倒計時298
第 2 步:播放聲音文件.298
第 3 步:類似程序的想法.299
15.10 小結 299
15.11 習題300
15.12 實踐項目.300
15.12.1 美化的秒表300
15.12.2 計劃的 Web 漫畫下載301
第 16 章 發送電子郵件和短信303
16.1 SMTP303
16.2 發送電子郵件304
16.2.1 連接到 SMTP 服務器304
16.2.2 發送 SMTP 的“Hello”
消息305
16.2.3 開始 TLS 加密306
16.2.4 登錄到 SMTP 服務器306
16.2.5 發送電子郵件306
16.2.6 從 SMTP 服務器斷開307
16.3 IMAP 307
16.4 用 IMAP 獲取和刪除電子
郵件 307
16.4.1 連接到 IMAP 服務器308
16.4.2 登錄到 IMAP 服務器309
16.4.3 搜索電子郵件309
16.4.4 選擇文件夾309
16.4.5 執行搜索.310
16.4.6 大小限制.312
16.4.7 取郵件并標記為已讀312
16.4.8 從原始消息中獲取電子
郵件地址 .313
16.4.9 從原始消息中獲取正文.314
16.4.10 刪除電子郵件 .315
16.4.11 從 IMAP 服務器斷開.315
16.5 項目:向會員發送會費提醒
電子郵件 316
第 1 步:打開 Excel 文件 316
第 2 步:查找所有未付成員 317
第 3 步:發送定制的電子郵件
提醒 318
16.6 用 Twilio 發送短信 319
16.6.1 注冊 Twilio 賬號319
16.6.2 發送短信 .320
16.7 項目:“只給我發短信”
模塊 321
16.8 小結 322
16.9 習題 323
16.10 實踐項目 323
16.10.1 隨機分配家務活的電子
郵件程序 323
16.10.2 傘提醒程序 324
16.10.3 自動退訂 324
16.10.4 通過電子郵件控制你的
電腦 324
第 17 章 操作圖像327
17.1 計算機圖像基礎 327
17.1.1 顏色和 RGBA 值 328
17.1.2 坐標和 Box 元組329
17.2 用 Pillow 操作圖像 330
17.2.1 處理 Image 數據類型 331
17.2.2 裁剪圖片 .332
17.2.3 復制和粘貼圖像到其他
圖像 333
17.2.4 調整圖像大小 335
17.2.5 旋轉和翻轉圖像 336歡迎加入非盈利Python編程學習交流QQ群783462347,群里免費提供500+本Python書籍!
目 錄
17.2.6 更改單個像素338
17.3 項目:添加徽標.339
第 1 步:打開徽標圖像.340
第 2 步:遍歷所有文件并打開
圖像341
第 3 步:調整圖像的大小.341
第 4 步:添加徽標,并保存
更改342
第 5 步:類似程序的想法.343
17.4 在圖像上繪畫344
17.4.1 繪制形狀.344
17.4.2 繪制文本.346
17.5 小結.347
17.6 習題.348
17.7 實踐項目348
17.7.1 擴展和修正本章項目的
程序348
17.7.2 在硬盤上識別照片
文件夾.349
17.7.3 定制的座位卡350
第 18 章 用 GUI 自動化控制鍵盤和
鼠標351
18.1 安裝 pyautogui 模塊 .351
18.2 走對路 352
18.2.1 通過注銷關閉所有程序.352
18.2.2 暫停和自動防故障裝置.352
18.3 控制鼠標移動353
18.3.1 移動鼠標.354
18.3.2 獲取鼠標位置354
18.4 項目:“現在鼠標在
哪里?”355
第 1 步:導入模塊355
第 2 步:編寫退出代碼和無限
循環355
第 3 步:獲取并打印鼠標坐標356
18.5 控制鼠標交互. 357
18.5.1 點擊鼠標 .357
18.5.2 拖動鼠標 .357
18.5.3 滾動鼠標 .359
18.6 處理屏幕 360
18.6.1 獲取屏幕快照 360
18.6.2 分析屏幕快照 360
18.7 項目:擴展 mouseNow 程序 361
18.8 圖像識別 362
18.9 控制鍵盤 363
18.9.1 通過鍵盤發送一個
字符串 .363
18.9.2 鍵名 364
18.9.3 按下和釋放鍵盤 365
18.9.4 熱鍵組合 .365
18.10 復習 PyAutoGUI 的函數 366
18.11 項目:自動填表程序. 367
第 1 步:弄清楚步驟 368
第 2 步:建立坐標 368
第 3 步:開始鍵入數據 .370
第 4 步:處理選擇列表和單選
按鈕 371
第 5 步:提交表單并等待 .372
18.12 小結 372
18.13 習題 373
18.14 實踐項目 373
18.14.1 看起來很忙 373
18.14.2 即時通信機器人 .373
18.14.3 玩游戲機器人指南 374
附錄 A 安裝第三方模塊375
附錄 B 運行程序377
附錄 C 習題答案 .381
總結
以上是生活随笔為你收集整理的AutomateTheBoringStuffWithPython的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Open API是什么?
- 下一篇: websocket python爬虫_p