讀書:Python編程快速上手——讓繁瑣工作自動化2

讀書:Python編程快速上手——讓繁瑣工作自動化2

來自專欄 3個月python學習筆記

第二部分:自動化任務

第7章 模式匹配與正則表達式

字元串操作技巧

for i in range(len(message)): chunk = message[i:i+12] #i及以後12個 if isPhoneNumber(chunk): #判斷函數 pass

1、創建正則表達式對象

import rephoneNumRegex = re.compile(rddd-ddd-dddd) #返回正則對象

2、匹配Regex對象

mo = phoneNumRegex.search(My number is 415-555-4242.)

3、調用Match對象的group()方法,返回實際匹配文本的字元串。

print(Phone number found: + mo.group())

匹配括弧轉義

re.compile(r((ddd))

匹配多個

re.compile(rBat(man|mobile|copter|bat))

問號實現可選匹配(0,1)

re.compile(rBat(wo)?man)

(wo)?部分表明,模式wo是可選的分組。該正則表達式匹配的文本中,wo將出現零次或一次。

星號匹配零次或多次(0,n)

re.compile(rBat(wo)*man)

對於Batwowowowoman,(wo)*匹配wo的4個實例。

加號匹配一次或多次(1,n)

re.compile(rBat(wo)+man)

花括弧匹配特定次數

正則表達式(Ha){3}將匹配字元串HaHaHa,但不會匹配HaHa。(Ha){3,5}將匹配HaHaHa、HaHaHaHa和HaHaHaHaHa。 #範圍(Ha){3,}將匹配3次或更多次實例,(Ha){,5}將匹配0到5次實例。

貪心和非貪心匹配

Python的正則表達式默認是「貪心」的,這表示在有二義的情況下,它們會儘可能匹配最長的字元串。 ?表示0或者1次,盡量小

>>> greedyHaRegex = re.compile(r(Ha){3,5})>>> mo1 = greedyHaRegex.search(HaHaHaHaHa)>>> mo1.group()HaHaHaHaHa>>> nongreedyHaRegex = re.compile(r(Ha){3,5}?)>>> mo2 = nongreedyHaRegex.search(HaHaHaHaHa)>>> mo2.group()HaHaHa

findall()方法,返回列表

Regex對象也有一個findall()方法。search()將返回一個Match對象,包含被查找字元串中的「第一次」匹配的文本,而findall()方法將返回一組字元串,包含被查找字元串中的所有匹配。

>>> phoneNumRegex = re.compile(rddd-ddd-dddd)>>> mo = phoneNumRegex.search(Cell: 415-555-9999 Work: 212-555-00>>> mo.group()415-555-9999>>> phoneNumRegex = re.compile(rddd-ddd-dddd) # has no groups>>> phoneNumRegex.findall(Cell: 415-555-9999 Work: 212-555-0000)[415-555-9999, 212-555-0000]>>> phoneNumRegex = re.compile(r(ddd)-(ddd)-(dddd)) #has groups>>> phoneNumRegex.findall(Cell: 415-555-9999 Work: 212-555-0000[(415, 555, 9999), (212, 555, 0000)]

總結:

作為findall()方法的返回結果的總結,請記住下面兩點:

1.如果調用在一個沒有分組的正則表達式上,例如ddd-ddd-dddd,方法findall()將返回一個匹配字元串的列表,例如[415-555-9999, 212-555-0000]。

2.如果調用在一個有分組的正則表達式上,例如(ddd)-(ddd)-(dddd),方法findall()將返回一個字元串的元組的列表(每個分組對應一個字元串),例如[(415, 555, 1122), (212, 555, 0000)]。

字元分類

通配字元

.(句點)字元稱為「通配符」。它匹配除了換行之外的所有字元。

>>> atRegex = re.compile(r.at)>>> atRegex.findall(The cat in the hat sat on the flat mat.)[cat, hat, sat, lat, mat]

點-星匹配所有字元

快速複習

?匹配零次或一次前面的分組。*匹配零次或多次前面的分組。+匹配一次或多次前面的分組。{n}匹配n次前面的分組。{n,}匹配n次或更多前面的分組。{,m}匹配零次到m次前面的分組。{n,m}匹配至少n次、至多m次前面的分組。{n,m}?或*?或+?對前面的分組進行非貪心匹配。^spam意味著字元串必須以spam開始。spam$意味著字元串必須以spam結束。.匹配所有字元,換行符除外。d、w和s分別匹配數字、單詞和空格。D、W和S分別匹配出數字、單詞和空格外的所有字元。[abc]匹配方括弧內的任意字元(諸如a、b或c)。[^abc]匹配不在方括弧內的任意字元。

不區分大小寫的匹配 re.I

>>> robocop = re.compile(rrobocop, re.I)>>> robocop.search(RoboCop is part man, part machine, all cop.).group()RoboCop>>> RoboCop

管理複雜的正則表達式

如果要匹配的文本模式很簡單,正則表達式就很好。但匹配複雜的文本模式,可能需要長的、費解的正則表達式。你可以告訴re.compile(),忽略正則表達式字元串中的空白符和注釋,從而緩解這一點。要實現這種詳細模式,可以向re.compile()傳入變數re.VERBOSE,作為第二個參數。

使用re.VERBOSE來編寫注釋,還希望使用re.IGNORECASE來忽略大小寫。

someRegexValue = re.compile(foo, re.IGNORECASE | re.DOTALL)

項目:電話號碼和E-mail地址提取程序 思路:

1、從剪貼板取得文本。2、找出文本中所有的電話號碼和E-mail地址。3、將它們粘貼到剪貼板。現在你可以開始思考,如何用代碼來完成工作。代碼需要做下面的事情:1、使用pyperclip模塊複製和粘貼字元串。2、創建兩個正則表達式,一個匹配電話號碼,另一個匹配E-mail地址。3、對兩個正則表達式,找到所有的匹配,而不只是第一次匹配。4、將匹配的字元串整理好格式,放在一個字元串中,用於粘貼。5、如果文本中沒有找到匹配,顯示某種消息。

第8章 讀寫文件

Windows中,根文件夾名為C:,也稱為C:盤。在OS X和Linux中,根文件夾是/。

#不同平台看路徑>>> import os>>> os.path.join(usr, bin, spam)usr\bin\spam #轉義

構造文件夾路徑

import osmyFiles = [accounts.txt, details.csv, invite.docx]for filename in myFiles: print(os.path.join(C:\Users\asweigart, filename))

#利用os.getcwd()函數,可以取得當前工作路徑的字元串,並可以利用os.chdir()改變它。

print(當前路徑:+os.getcwd())os.chdir(C:\Windows\System32)print(當前路徑:+os.getcwd())

Python中,讀寫文件有3個步驟:

1.調用open()函數,返回一個File對象。

2.調用File對象的read()或write()方法。

3.調用File對象的close()方法,關閉該文件。

第9章 組織文件

shutil(或稱為shell工具)模塊中包含一些函數,讓你在Python程序中複製、移動、改名和刪除文件。要使用shutil的函數,首先需要import shutil。

第10章 調試

程序員之間流傳著一個老笑話:「編碼佔了編程工作量的90%,調試佔了另外90%。」

使用日誌模塊

要啟用logging模塊,在程序運行時將日誌信息顯示在屏幕上,請將下面的代碼複製到程序頂部(但在Python的#!行之下):

第11章 從Web抓取信息

第12章 處理Excel電子表格

用python讀寫excel的強大工具:openpyxl

用python讀寫excel的強大工具:openpyxl - _小蘋果 - 博客園?

www.cnblogs.com圖標

用python讀寫excel的強大工具:openpyxl

openpyxl中,主要用到三個概念:Workbooks,Sheets,Cells。Workbook就是一個excel工作表;Sheet是工作表中的一張表頁;Cell就是簡單的一個格。openpyxl就是圍繞著這三個概念進行的,不管讀寫都是「三板斧」:打開Workbook,定位Sheet,操作Cell。

更好教程

快速複習,下面是從電子表格文件中讀取單元格涉及的所有函數、方法和數據類型。

1.導入openpyxl模塊。2.調用openpyxl.load_workbook()函數。3.取得Workbook對象。4.調用get_active_sheet()或get_sheet_by_name()工作簿方法。5.取得Worksheet對象。6.使用索引或工作表的cell()方法,帶上row和column關鍵字參數。7.取得Cell對象。8.讀取Cell對象的value屬性。

第13章 處理PDF和Word文檔

PDF文檔

Word文檔

…………用到再說

第14章 處理CSV文件和JSON數據

CSV表示「Comma-Separated Values(逗號分隔的值)」,CSV文件是簡化的電子表格,保存為純文本文件。Python的csv模塊讓解析CSV文件變得容易。

JSON(發音為「JAY-sawn」或「Jason」,但如何發音並不重要。因為無論如何發音,都會有人說你發音錯誤)是一種格式,它以JavaScript源代碼的形式,將信息保存在純文本文件中。

csv模塊讀取CSV文件,首先用open()函數打開它,就像打開任何其他文本文件一樣。但是,不用在open()返回的File對象上調用read()或readlines()方法,而是將它傳遞給csv.reader()函數。這將返回一個Reader對象,供你使用。請注意,不能直接將文件名字元串傳遞給csv.reader()函數。

json

流行的網站,都提供json API讓程序使用。有些網站需要註冊,這幾乎都是免費的。你必須找到文檔,了解程序需要請求什麼 URL 才能獲得想要的數據,以及返回的JSON數據結構的一般格式。這些文檔應在提供API的網站上提供,如果它們有「開發者」頁面,就去那裡找找。

第15章 保持時間、計劃任務和啟動程序

程序可以每小時抓取一個網站,檢查變更,或在凌晨4點你睡覺時,執行CPU密集型任務。Python的time和datetime模塊提供了這些函數。

內置的time模塊讓Python程序能讀取系統時鐘的當前時間。在time模塊中,time.time()和time.sleep()函數是最有用的模塊。

Python內置的round()函數將它們縮短,該函數按照指定的精度四捨五入到一個浮點數。

>>> import time>>> now = time.time()>>> now1533267951.3129227 #1970年1月1日0點,即協調世界時(UTC)。time.time()函數返回自那一刻以來的秒數>>> round(now, 2)1533267951.31>>> round(now)1533267951

代碼塊開始時調用time.time(),並在結束時再次調用,就可以用第二個時間戳減去第一個,得到這兩次調用之間經過的時間。

datetime模塊

如果以更方便的格式顯示日期,或對日期進行算術運算(例如,搞清楚205天前是什麼日期,或123天後是什麼日期),就應該使用datetime模塊。

>>> import datetime>>> datetime.datetime.now()datetime.datetime(2018, 8, 3, 11, 50, 14, 958002)>>> dt = datetime.datetime(2015, 10, 21, 16, 29, 0)>>> dt.year, dt.month, dt.day(2015, 10, 21)>>> dt.hour, dt.minute, dt.second(16, 29, 0)

多進程:

import threading, timeprint(Start of program.)def takeANap(): time.sleep(5) print(Wake up!)threadObj = threading.Thread(target=takeANap) #生兒子了threadObj.start()print(End of program.)Start of program.End of program.Wake up!

為了避免並發問題,絕不讓多個線程讀取或寫入相同的變數。當創建一個新的Thread對象時,要確保其目標函數只使用該函數中的局部變數。這將避免程序中難以調試的並發問題。

後面感覺不用學了,一般用不到,用時再說

附錄

PyPI或Python包索引,就像是Python模塊的免費應用程序商店。

運行你的Python程序,可以創建一個.BAT批處理文件,用py.exe來運行Python程序。

@py.exe C:path oyourpythonScript.py %*@pause

推薦閱讀:

編程,在這一刻溫暖人心!!!
2018-6-29 計算機基礎
怒刷 LeetCode 100 道 (46)
python3零基礎快速通關
業餘愛好者如何學習編程

TAG:編程 | 編程語言 | Python |