os
模塊提供了許多與操作系統交互的函數:
os.getcwd()
返回當前目錄
os.chdir()
改變當前工作目錄
os.system()
在shell中執行命令
dir()
返回模塊中的函數和屬性
help()
返回模塊幫助
>>> import os
>>> os.getcwd() # 返回當前目錄
'C:\\Python310'
>>> os.chdir('/server/accesslogs') # 改變當前工作目錄
>>> os.system('mkdir today') #創建文件夾‘today’
>>> 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
模塊提供了更易於使用的更高級別的接口:
復制copyfile
、移動文件move
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db') # src, dest
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
glob
模塊提供了一個在目錄中使用通配符搜索創建文件列表的函數:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
通用實用程序腳本通常需要處理命令行參數。這些參數作為列表存儲在 sys
模塊的 argv 屬性中。例如,輸出命令行參數:
創建demo.py
,寫入
import sys
print(sys.argv))
然後再終端運行 python demo.py one two three
終端輸出:
['demo.py', 'one', 'two', 'three']
可以看到,第0個參數是文件的名字。
argparse
模塊提供了一種更復雜的機制來處理命令行參數。 以下腳本可提取一個或多個文件名,並可選擇要顯示的行數:
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']
。
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()
。
re
模塊為高級字符串處理提供正則表達式工具。對於復雜的匹配和操作,正則表達式提供簡潔,優化的解決方案。在爬蟲中,我們經常需要在一堆字符串中使用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'
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) # 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
模塊計算數值數據的基本統計屬性(均值,中位數,方差等):
>>> 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> 有許多其他模塊用於數值計算(傅裡葉變化、信號處理等)。
有許多模塊可用於訪問互聯網和處理互聯網協議。其中兩個最簡單的 urllib.request
用於從URL檢索數據,以及 smtplib
用於發送郵件。(第三方庫requests
比urllib
更方便)
>>> 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('[email protected]', '[email protected]',
... """To: [email protected]
... From: [email protected]
...
... Beware the Ides of March.
... """)
>>> server.quit()
(請注意,第二個示例需要在localhost上運行的郵件服務器。)
datetime
模塊提供了以簡單和復雜的方式操作日期和時間的類。雖然支持日期和時間算法,但實現的重點是有效的成員提取以進行輸出格式化和操作。該模塊還支持可感知時區的對象。
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2022, 6, 12)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'06-12-22\. 12 Jun 2022 is a Sunday on the 12 day of June.'
>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
常見的數據存檔和壓縮格式由模塊直接支持,包括: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
一些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
模塊提供了用於在較大的代碼塊中識別時間關鍵部分的工具。
開發高質量軟件的一種方法是在開發過程中為每個函數編寫測試,並在開發過程中經常運行這些測試。
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() # 從命令行調用所有測試方法。
Python有“自帶電池”的理念。通過其包的復雜和強大功能可以最好地看到這一點。例如:
The xmlrpc.client
and xmlrpc.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 規范的郵件文檔。與 smtplib
和 poplib
不同(它們實際上做的是發送和接收消息),電子郵件包提供完整的工具集,用於構建或解碼復雜的消息結構(包括附件)以及實現互聯網編碼和標頭協議。
json
包為解析這種流行的數據交換格式提供了強大的支持。 csv
模塊支持以逗號分隔值格式直接讀取和寫入文件,這種格式通常為數據庫和電子表格所支持。 XML 處理由 xml.etree.ElementTree
, xml.dom
和 xml.sax
包支持。這些模塊和軟件包共同大大簡化了 Python 應用程序和其他工具之間的數據交換。
sqlite3
模塊是 SQLite 數據庫庫的包裝器,提供了一個可以使用稍微非標准的 SQL 語法更新和訪問的持久數據庫。
國際化由許多模塊支持,包括 gettext
, locale
,以及 codecs
包。