10. 標(biāo)準(zhǔn)庫(kù)簡(jiǎn)介?
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 *
。這將避免內(nèi)建的 open()
函數(shù)被 os.open()
隱式替換掉,因?yàn)樗鼈兊氖褂梅绞酱蟛幌嗤?/p>
內(nèi)置的 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>
對(duì)于日常文件和目錄管理任務(wù), shutil
模塊提供了更易于使用的更高級(jí)別的接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
10.2. 文件通配符?
glob
模塊提供了一個(gè)在目錄中使用通配符搜索創(chuàng)建文件列表的函數(shù):
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. 命令行參數(shù)?
通用實(shí)用程序腳本通常需要處理命令行參數(shù)。這些參數(shù)作為列表存儲(chǔ)在 sys
模塊的 argv 屬性中。例如,以下輸出來(lái)自在命令行運(yùn)行 python demo.py one two three
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
argparse
模塊提供了一種更復(fù)雜的機(jī)制來(lái)處理命令行參數(shù)。 以下腳本可提取一個(gè)或多個(gè)文件名,并可選擇要顯示的行數(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)
當(dāng)在通過(guò) python top.py --lines=5 alpha.txt beta.txt
在命令行運(yùn)行時(shí),該腳本會(huì)將 args.lines
設(shè)為 5
并將 args.filenames
設(shè)為 ['alpha.txt', 'beta.txt']
。
10.4. 錯(cuò)誤輸出重定向和程序終止?
sys
模塊還具有 stdin , stdout 和 stderr 的屬性。后者對(duì)于發(fā)出警告和錯(cuò)誤消息非常有用,即使在 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
模塊為高級(jí)字符串處理提供正則表達(dá)式工具。對(duì)于復(fù)雜的匹配和操作,正則表達(dá)式提供簡(jiǎn)潔,優(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'
當(dāng)只需要簡(jiǎn)單的功能時(shí),首選字符串方法因?yàn)樗鼈兏菀组喿x和調(diào)試:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. 數(shù)學(xué)?
math
模塊提供對(duì)浮點(diǎn)數(shù)學(xué)的底層C庫(kù)函數(shù)的訪(fǎng)問(wèn):
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
random
模塊提供了進(jìn)行隨機(jī)選擇的工具:
>>> 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
模塊計(jì)算數(shù)值數(shù)據(jù)的基本統(tǒng)計(jì)屬性(均值,中位數(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項(xiàng)目 <https://scipy.org> 有許多其他模塊用于數(shù)值計(jì)算。
10.7. 互聯(lián)網(wǎng)訪(fǎng)問(wèn)?
有許多模塊可用于訪(fǎng)問(wèn)互聯(lián)網(wǎng)和處理互聯(lián)網(wǎng)協(xié)議。其中兩個(gè)最簡(jiǎn)單的 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()
(請(qǐng)注意,第二個(gè)示例需要在localhost上運(yùn)行的郵件服務(wù)器。)
10.8. 日期和時(shí)間?
datetime
模塊提供了以簡(jiǎn)單和復(fù)雜的方式操作日期和時(shí)間的類(lèi)。雖然支持日期和時(shí)間算法,但實(shí)現(xiàn)的重點(diǎn)是有效的成員提取以進(jìn)行輸出格式化和操作。該模塊還支持可感知時(shí)區(qū)的對(duì)象。
>>> # 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ù)壓縮?
常見(jiàn)的數(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. 性能測(cè)量?
一些Python用戶(hù)對(duì)了解同一問(wèn)題的不同方法的相對(duì)性能產(chǎn)生了濃厚的興趣。 Python提供了一種可以立即回答這些問(wèn)題的測(cè)量工具。
例如,元組封包和拆包功能相比傳統(tǒng)的交換參數(shù)可能更具吸引力。timeit
模塊可以快速演示在運(yùn)行效率方面一定的優(yōu)勢(shì):
>>> 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
的精細(xì)粒度級(jí)別相反, profile
和 pstats
模塊提供了用于在較大的代碼塊中識(shí)別時(shí)間關(guān)鍵部分的工具。
10.11. 質(zhì)量控制?
開(kāi)發(fā)高質(zhì)量軟件的一種方法是在開(kāi)發(fā)過(guò)程中為每個(gè)函數(shù)編寫(xiě)測(cè)試,并在開(kāi)發(fā)過(guò)程中經(jīng)常運(yùn)行這些測(cè)試。
doctest
模塊提供了一個(gè)工具,用于掃描模塊并驗(yàn)證程序文檔字符串中嵌入的測(cè)試。測(cè)試構(gòu)造就像將典型調(diào)用及其結(jié)果剪切并粘貼到文檔字符串一樣簡(jiǎn)單。這通過(guò)向用戶(hù)提供示例來(lái)改進(jìn)文檔,并且它允許doctest模塊確保代碼保持對(duì)文檔的真實(shí):
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
模塊那樣易于使用,但它允許在一個(gè)單獨(dú)的文件中維護(hù)更全面的測(cè)試集:
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有“自帶電池”的理念。通過(guò)其包的復(fù)雜和強(qiáng)大功能可以最好地看到這一點(diǎn)。例如:
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
包是一個(gè)用于管理電子郵件的庫(kù),包括MIME和其他符合 RFC 2822 規(guī)范的郵件文檔。與smtplib
和poplib
不同(它們實(shí)際上做的是發(fā)送和接收消息),電子郵件包提供完整的工具集,用于構(gòu)建或解碼復(fù)雜的消息結(jié)構(gòu)(包括附件)以及實(shí)現(xiàn)互聯(lián)網(wǎng)編碼和標(biāo)頭協(xié)議。json
包為解析這種流行的數(shù)據(jù)交換格式提供了強(qiáng)大的支持。csv
模塊支持以逗號(hào)分隔值格式直接讀取和寫(xiě)入文件,這種格式通常為數(shù)據(jù)庫(kù)和電子表格所支持。 XML 處理由xml.etree.ElementTree
,xml.dom
和xml.sax
包支持。這些模塊和軟件包共同大大簡(jiǎn)化了 Python 應(yīng)用程序和其他工具之間的數(shù)據(jù)交換。sqlite3
模塊是 SQLite 數(shù)據(jù)庫(kù)庫(kù)的包裝器,提供了一個(gè)可以使用稍微非標(biāo)準(zhǔn)的 SQL 語(yǔ)法更新和訪(fǎng)問(wèn)的持久數(shù)據(jù)庫(kù)。