10. 標準庫簡介?
10.1. 操作系統(tǒng)接口?
os
模塊提供了許多與操作系統(tǒng)交互的函數(shù):
>>> import os
>>> os.getcwd() # Return the current working directory
'C:\\Python312'
>>> os.chdir('/server/accesslogs') # Change current working directory
>>> os.system('mkdir today') # Run the command mkdir in the system shell
0
一定要使用 import os
而不是 from os import *
。這將避免內建的 open()
函數(shù)被 os.open()
隱式替換掉,因為它們的使用方式大不相同。
內置的 dir()
和 help()
函數(shù)可用作交互式輔助工具,用于處理大型模塊,如 os
:
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
對于日常文件和目錄管理任務, shutil
模塊提供了更易于使用的更高級別的接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
10.2. 文件通配符?
glob
模塊提供了一個在目錄中使用通配符搜索創(chuàng)建文件列表的函數(shù):
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. 命令行參數(shù)?
通用實用程序腳本通常需要處理命令行參數(shù)。這些參數(shù)作為列表存儲在 sys
模塊的 argv 屬性中。例如,以下輸出來自在命令行運行 python demo.py one two three
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
argparse
模塊提供了一種更復雜的機制來處理命令行參數(shù)。 以下腳本可提取一個或多個文件名,并可選擇要顯示的行數(shù):
import argparse
parser = argparse.ArgumentParser(
prog='top',
description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
當在通過 python top.py --lines=5 alpha.txt beta.txt
在命令行運行時,該腳本會將 args.lines
設為 5
并將 args.filenames
設為 ['alpha.txt', 'beta.txt']
。
10.4. 錯誤輸出重定向和程序終止?
sys
模塊還具有 stdin , stdout 和 stderr 的屬性。后者對于發(fā)出警告和錯誤消息非常有用,即使在 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
模塊為高級字符串處理提供正則表達式工具。對于復雜的匹配和操作,正則表達式提供簡潔,優(yōu)化的解決方案:
>>> 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. 數(shù)學?
math
模塊提供對浮點數(shù)學的底層C庫函數(shù)的訪問:
>>> 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) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4
statistics
模塊計算數(shù)值數(shù)據(jù)的基本統(tǒng)計屬性(均值,中位數(shù),方差等):
>>> 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
SciPy項目 <https://scipy.org> 有許多其他模塊用于數(shù)值計算。
10.7. 互聯(lián)網訪問?
有許多模塊可用于訪問互聯(lián)網和處理互聯(lián)網協(xié)議。其中兩個最簡單的 urllib.request
用于從URL檢索數(shù)據(jù),以及 smtplib
用于發(fā)送郵件:
>>> from urllib.request import urlopen
>>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
... for line in response:
... line = line.decode() # Convert bytes to a str
... if line.startswith('datetime'):
... print(line.rstrip()) # Remove trailing newline
...
datetime: 2022-01-01T01:36:47.689215+00:00
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
(請注意,第二個示例需要在localhost上運行的郵件服務器。)
10.8. 日期和時間?
datetime
模塊提供了以簡單和復雜的方式操作日期和時間的類。雖然支持日期和時間算法,但實現(xiàn)的重點是有效的成員提取以進行輸出格式化和操作。該模塊還支持可感知時區(qū)的對象。
>>> # dates are easily constructed and formatted
>>> 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.'
>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
10.9. 數(shù)據(jù)壓縮?
常見的數(shù)據(jù)存檔和壓縮格式由模塊直接支持,包括: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提供了一種可以立即回答這些問題的測量工具。
例如,元組封包和拆包功能相比傳統(tǒng)的交換參數(shù)可能更具吸引力。timeit
模塊可以快速演示在運行效率方面一定的優(yōu)勢:
>>> 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. 質量控制?
開發(fā)高質量軟件的一種方法是在開發(fā)過程中為每個函數(shù)編寫測試,并在開發(fā)過程中經常運行這些測試。
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() # automatically validate the embedded tests
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() # Calling from the command line invokes all tests
10.12. 自帶電池?
Python有“自帶電池”的理念。通過其包的復雜和強大功能可以最好地看到這一點。例如:
The
xmlrpc.client
andxmlrpc.server
modules make implementing remote procedure calls into an almost trivial task. Despite the modules' names, no direct knowledge or handling of XML is needed.email
包是一個用于管理電子郵件的庫,包括MIME和其他符合 RFC 2822 規(guī)范的郵件文檔。與smtplib
和poplib
不同(它們實際上做的是發(fā)送和接收消息),電子郵件包提供完整的工具集,用于構建或解碼復雜的消息結構(包括附件)以及實現(xiàn)互聯(lián)網編碼和標頭協(xié)議。json
包為解析這種流行的數(shù)據(jù)交換格式提供了強大的支持。csv
模塊支持以逗號分隔值格式直接讀取和寫入文件,這種格式通常為數(shù)據(jù)庫和電子表格所支持。 XML 處理由xml.etree.ElementTree
,xml.dom
和xml.sax
包支持。這些模塊和軟件包共同大大簡化了 Python 應用程序和其他工具之間的數(shù)據(jù)交換。sqlite3
模塊是 SQLite 數(shù)據(jù)庫庫的包裝器,提供了一個可以使用稍微非標準的 SQL 語法更新和訪問的持久數(shù)據(jù)庫。