Python 標準庫概覽 常用詳解
10.1. 作業系統介面#
os
模組提供了大量和作業系統進行互動的函式:
>>> import os
>>> os.getcwd() # 返回當前工作路徑
'C:\\Python37'
>>> os.chdir('/server/accesslogs') # 改變當前工作路徑
>>> os.system('mkdir today') # 呼叫系統shell自帶的mkdir命令
0
請確保使用 import os
而不是 from os import *
。第二種方法會導致 os.open()
覆蓋系統自帶的 open()
函式,這兩個函式的功能有很大的不同。
自帶的 dir()
和 help()
函式在使用大型模組如 os
時能夠成為非常有用的互動工具:
>>> import os
>>> dir(os)
<返回一個包含os模組所有函式的list>
>>> help(os)
<返回一個從os模組docstring產生的手冊>
對於日常的檔案或者目錄管理任務,shutil
模組提供了更高層次的介面,可以讓使用者更容易地使用:
>>> import shutil >>> shutil.copyfile('data.db', 'archive.db') 'archive.db' >>> shutil.move('/build/executables', 'installdir') 'installdir'
10.2. 檔案萬用字元#
glob
模組提供了一個函式,用於在目錄中進行萬用字元搜尋,得到一個檔案列表。
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. 命令列引數#
常見的工具類指令碼經常需要處理命令列引數。 這些引數儲存在 sys
模組的 argv 屬性中,作為一個列表存在。例如,以下是在命令列執行 python demo.py one two three
的結果輸出:
>>> import sys >>> print(sys.argv) ['demo.py', 'one', 'two', 'three']
getopt
模組使用 Unix 約定的 getopt()
函式處理 sys.argv 。更強大、靈活的命令列處理由 argparse
模組提供。
10.4. 錯誤輸出重定向和退出程式#
sys
模組有 stdin,stdout 和 stderr 這些屬性。後者在處理警告和錯誤資訊時非常有用,就算 stdout 被重定向了,還是能看見錯誤資訊:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
退出程式最直接的方法是用 sys.exit()
。
10.5. 字串匹配#
re
模組為字串的進階處理提供了正則表示式的工具。對於複雜的匹配操作,正則表示式給出了簡潔有效的解決方案:
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
當只需要簡單的功能時,採用字串的方法更簡潔易懂:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. 數學庫#
math
模組可以訪問C語言編寫的浮點型別數學庫函式:
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
random
模組提供了進行隨機選擇的工具:
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # 不重複抽樣
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # 隨機的 float 型別輸出
0.17970987693706186
>>> random.randrange(6) # 從 range(6) 的返回範圍內產生隨機數
4
statistics
模組可以計算數字資料的基本統計屬性(平均值、中值、方差等):
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
10.7. 網路請求#
有一大堆模組可以訪問網路並根據各自網路協議來處理資料。其中最簡單的兩個分別是用於從URL獲取資料的 urllib.request
和用於傳送郵件的 smtplib
:
>>> from urllib.request import urlopen
>>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
... for line in response:
... line = line.decode('utf-8') # 解碼.
... if 'EST' in line or 'EDT' in line: # 檢視是否是EST或EDT時間
... print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('[email protected]', '[email protected]',
... """To: [email protected]
... From: [email protected]
...
... Beware the Ides of March.
... """)
>>> server.quit()
(注意,第二個例子需要本地執行一個郵件伺服器。)
10.8. 日期和時間#
datetime
模組提供了多種用於簡單處理和複雜處理日期和時間的類。支援日期時間的運算、時間解析、格式化輸出等,實現上重點優化了效率。模組也支援了時區的概念。
>>> # 日期物件能非常方便的構建和輸出
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # 支援日期運算
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
10.9. 資料壓縮#
這些模組支援了常見的資料壓縮格式: zlib
, gzip
, bz2
, lzma
, zipfile
, tarfile
.
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
10.10. 效能測試#
許多 Python 使用者對於同一個問題的多種實現手段的效能比較很感興趣。Python 也提供了評估工具來解決此類問題。
例如,使用元組解包來實現變數交換是否高效,用 timeit
模組來快速實現一個性能比較:
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
與 timeit
的作用不同,profile
和 pstats
模組則提供了從一大堆程式碼中分析出最耗時部分的工具。
10.11. 質量管控#
開發高質量軟體的方法之一是在開發過程中為每個函式編寫測試,並在開發過程中反覆地執行這些測試。
doctest
模組提供了一個工具,用來掃描模組和驗證程式文件字串中嵌入的測試。測試構造就如同將函式的典型呼叫及其結果複製貼上到文件字串中一樣簡單。它通過向用戶提供示例來改進文件,並且使得 doctest 模組能夠確保程式碼保持對文件的正確性:
def average(values):
"""Computes the arithmetic mean of a list of numbers.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)
import doctest
doctest.testmod() # 自動驗證嵌入的測試
unittest
模組並不像doctest
模組那樣輕鬆,但它能夠在單獨的檔案中維護一個更全面的測試集:
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
unittest.main() # 從命令列上呼叫能觸發所有測試
10.12. 自給自足#
Python 展現了"自給自足"的哲學。它的那些大量豐富的、健壯的包,充分地說明了這個。例如:
xmlrpc.client
和xmlrpc.server
模組使得遠端呼叫變得輕而易舉。儘管模組名如此,但使用者完全不需要掌握XML相關的知識就能使用。email
模組管理了包括 MIME 和其他基於 RFC 2822 資訊文件的郵件資訊。不同於實際傳送和接受郵件的smtplib
和poplib
模組, email 模組提供了一個完整的工具集用於構造及解析複雜的訊息結構(包括附件),以及處理各種編碼和協議頭。json
模組提供了對 JSON 這種流行的資料交換格式的強大支援。csv
模組則提供了直接讀寫CSV(逗號分隔文字)檔案的能力,這種格式被資料庫和電子表單廣泛支援。XML 處理則由xml.etree.ElementTree
、xml.dom
和xml.sax
這些模組來完成。這些模組也同樣大大簡化了 Python 應用和其他工具間的資訊交換。sqlite3
模組封裝了 SQLite 資料庫的查詢、更新介面,這是一種有著不同 SQL 語法的持久化資料庫。