核心模塊html
更多標準模塊node
線程和進程python
數據表示react
文件格式ios
郵件和新聞消息處理git
網絡協議程序員
國際化web
多媒體相關模塊正則表達式
數據儲存算法
工具和實用程序
其餘模塊
執行支持模塊
其餘模塊
Python 的標準庫包括了不少的模塊, 從 Python 語言自身特定的類型和聲明, 到一些只用於少數程序的不著名的模塊.
下面的這兩個模塊比其餘模塊加在一塊兒還要重要: 定義內建函數(例如 len, int, range ...)的 _ _builtin_ _ 模塊, 以及定義全部內建異常的 exceptions模塊.
Python 在啓動時導入這兩個模塊, 使任何程序都可以使用它們.
Python 有許多使用了 POSIX 標準 API 和標準 C 語言庫的模塊. 它們爲底層操做系統提供了平臺獨立的接口.
這類的模塊包括: 提供文件和進程處理功能的 os 模塊; 提供平臺獨立的文件名處理 (分拆目錄名, 文件名, 後綴等)的 os.path 模塊; 以及時間日期處理相關的 time/datetime 模塊.
[!Feather注: datetime 爲 Py2.3 新增模塊, 提供加強的時間處理方法 ]
延伸一點說, 網絡和線程模塊一樣也能夠歸爲這一個類型. 不過 Python 並無在全部的平臺/版本實現這些.
標準庫裏有許多用於支持內建類型操做的庫. string 模塊實現了經常使用的字符串處理. math 模塊提供了數學計算操做和常量(pi, e都屬於這類常量), cmath模塊爲複數提供了和 math 同樣的功能.
re 模塊爲 Python 提供了正則表達式支持. 正則表達式是用於匹配字符串或特定子字符串的 有特定語法的字符串模式.
sys 模塊可讓你訪問解釋器相關參數,好比模塊搜索路徑,解釋器版本號等. operator 模塊提供了和內建操做符做用相同的函數. copy 模塊容許 你複製對象, Python 2.0 新加入的 gc 模塊提供了對垃圾收集的相關控制功能.
這個模塊包含 Python 中使用的內建函數. 通常不用手動導入這個模塊; Python會幫你作好一切.
Python容許你實時地建立函數參數列表. 只要把全部的參數放入一個元組中, 而後經過內建的 apply 函數調用函數
要想把關鍵字參數傳遞給一個函數, 你能夠將一個字典做爲 apply 函數的第 3 個參數,
apply 函數的一個常見用法是把構造函數參數從子類傳遞到基類, 尤爲是構造函數須要接受不少參數的時候.
Python 2.0 提供了另個方法來作相同的事. 你只須要使用一個傳統的函數調用 , 使用 * 來標記元組, ** 來標記字典.
下面兩個語句是等價的:
result = function(*args, **kwargs) result = apply(function, args, kwargs)
若是你寫過較龐大的 Python 程序, 那麼你就應該知道 import 語句是用來導入外部模塊的 (固然也可使用 from-import 版本). 不過你可能不知道import 實際上是靠調用內建 函數 _ _import_ _ 來工做的.
經過這個戲法你能夠動態地調用函數. 當你只知道模塊名稱(字符串)的時候, 這將很方便. Example 1-4 展現了這種用法, 動態地導入全部以 "-plugin" 結尾的模塊.
注意,當你重加載模塊時, 它會被從新編譯, 新的模塊會代替模塊字典裏的老模塊. 可是, 已經用原模塊裏的類創建的實例仍然使用的是老模塊(不會被更新).
一樣地, 使用 from-import 直接建立的到模塊內容的引用也是不會被更新的.
dir 返回由給定模塊, 類, 實例, 或其餘類型的全部成員組成的列表. 這可能在交互式 Python 解釋器下頗有用, 也能夠用在其餘地方. .
getmembers 函數返回了一個有序列表. 成員在列表中名稱出現的越早, 它所處的類層次就越高. 若是無所謂順序的話, 你可使用字典代替列表.vars 函數與此類似, 它返回的是包含每一個成員當前值的字典. 若是你使用不帶參數的 vars , 它將返回當前局部名稱空間的可見元素(同 locals() 函數 ).
Python 是一種動態類型語言, 這意味着給一個定變量名能夠在不一樣的場合綁定到不一樣的類型上. 在接下面例子中, 一樣的函數分別被整數, 浮點數, 以及一個字符串調用:
你能夠在 operator 模塊中找到檢查對象是否爲某一內建類型(數字, 序列, 或者字典等) 的函數. 可是, 由於建立一個類很簡單(好比實現基本序列方法的類), 因此對這些 類型使用顯式的類型判斷並非好主意.
在處理類和實例的時候會複雜些. Python 不會把類做爲本質上的類型對待; 相反地, 全部的類都屬於一個特殊的類類型(special class type), 全部的類實例屬於一個特殊的實例類型(special instance type).
這意味着你不能使用 type 函數來測試一個實例是否屬於一個給定的類; 全部的實例都是一樣 的類型! 爲了解決這個問題, 你可使用 isinstance 函數,它會檢查一個對象是 不是給定類(或其子類)的實例.
eval 函數只針對簡單的表達式. 若是要處理大塊的代碼, 你應該使用 compile 和 exec 函數
由於 Python 在檢查局部名稱空間和模塊名稱空間前不會檢查內建函數, 因此有時候你可能要顯式地引用 _ _builtin_ _ 模塊. 例如 Example 1-25 重載了內建的 open 函數. 這時候要想使用原來的 open 函數, 就須要腳本顯式地指明模塊名稱.
exceptions 模塊提供了標準異常的層次結構. Python 啓動的時候會自動導入這個模塊, 而且將它加入到 _ _builtin_ _ 模塊中. 也就是說, 通常不須要手動導入這個模塊.
該模塊定義瞭如下標準異常:
你能夠建立本身的異常類. 只須要繼承內建的 Exception 類(或者它的任意一個合適的子類)便可, 有須要時能夠再重載它的 _ _str_ _ 方法.
這個模塊中的大部分函數經過對應平臺相關模塊實現, 好比 posix 和 nt. os 模塊會在第一次導入的時候自動加載合適的執行模塊.
內建的 open / file 函數用於建立, 打開和編輯文件. 而 os 模塊提供了重命名和刪除文件所需的函數.
os 模塊也包含了一些用於目錄處理的函數.
listdir 函數返回給定目錄中全部文件名(包括目錄名)組成的列表. 而 Unix 和 Windows 中使用的當前目錄和父目錄標記(. 和 .. )不包含在此列表中.
makedirs 和 removedirs 函數用於建立或刪除目錄層,
removedirs 函數會刪除所給路徑中最後一個目錄下全部的空目錄. 而 mkdir 和 rmdir 函數只能處理單個目錄級.
若是須要刪除非空目錄, 你可使用 shutil 模塊中的 rmtree 函數.
stat 函數能夠用來獲取一個存在文件的信息,. 它返回一個類元組對象(stat_result對象, 包含 10 個元素), 依次是st_mode (權限模式), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (全部者用戶 ID), st_gid (全部者所在組 ID ), st_size (文件大小, 字節), st_atime (最近一次訪問時間), st_mtime (最近修改時間), st_ctime (平臺相關; Unix下的最近一次元數據/metadata修改時間, 或者 Windows 下的建立時間) - 以上項目也可做爲屬性訪問.
stat 模塊包含了不少能夠處理該返回對象的常量及函數. 下面的代碼展現了其中的一些.
可使用 chmod 和 utime 函數修改文件的權限模式和時間屬性
system 函數在當前進程下執行一個新命令, 並等待它完成,.
exec 函數會使用新進程替換當前進程(或者說是"轉到進程"). 在 Example 1-35 中, 字符串 "goodbye" 永遠不會被打印.
Python 提供了不少表現不一樣的 exec 函數. Example 1-35 使用的是 execvp 函數, 它會從標準路徑搜索執行程序, 把第二個參數(元組)做爲單獨的參數傳遞給程序, 並使用當前的環境變量來運行程序. 其餘七個同類型函數請參閱 Python Library Reference .
在 Unix 環境下, 你能夠經過組合使用 exec , fork 以及 wait 函數來從當前程序調用另外一個程序. fork 函數複製當前進程, wait函數會等待一個子進程執行結束.
fork 函數在子進程返回中返回 0 (這個進程首先從 fork 返回值), 在父進程中返回一個非 0 的進程標識符(子進程的 PID ). 也就是說, 只有當咱們處於子進程的時候 "not pid" 才爲真.
fork 和 wait 函數在 Windows 上是不可用的, 可是你可使用 spawn 函數, . 不過, spawn 不會沿着路徑搜索可執行文件, 你必須本身處理好這些.
spawn 函數還可用於在後臺運行一個程序. Example 1-38 給 run 函數添加了一個可選的 mode 參數; 當設置爲 os.P_NOWAIT 時, 這個腳本不會等待子程序結束, 默認值 os.P_WAIT 時 spawn 會等待子進程結束.
其它的標誌常量還有 os.P_OVERLAY ,它使得 spawn 的行爲和 exec 相似, 以及 os.P_DETACH , 它在後臺運行子進程, 與當前控制檯和鍵盤焦點隔離.
Unix 系統中, 你可使用 fork 函數把當前進程轉入後臺(一個"守護者/daemon"). 通常來講, 你須要派生(fork off)一個當前進程的副本, 而後終止原進程
os.setpgrp()
爲了確保守護進程建立的文件可以得到程序指定的 mode flags(權限模式標記?), 最好刪除 user mode mask:
os.umask(0)
而後, 你應該重定向 stdout/stderr 文件, 而不能只是簡單地關閉它們(若是你的程序須要 stdout 或 stderr 寫入內容的時候, 可能會出現意想不到的問題).
class NullDevice: def write(self, s): pass sys.stdin.close() sys.stdout = NullDevice() sys.stderr = NullDevice()
換言之, 因爲 Python 的 print 和 C 中的 printf/fprintf 在設備(device) 沒有鏈接後不會關閉你的程序, 此時守護進程中的 sys.stdout.write() 會拋出一個 IOError 異常, 而你的程序依然在後臺運行的很好....
另外, 先前例子中的 _exit 函數會終止當前進程. 而 sys.exit 不一樣, 若是調用者(caller) 捕獲了 SystemExit 異常, 程序仍然會繼續執行. .
os.path 模塊包含了各類處理長文件名(路徑名)的函數. 先導入 (import) os 模塊, 而後就能夠以 os.path 訪問該模塊.
os.path 模塊包含了許多與平臺無關的處理長文件名的函數. 也就是說, 你不須要處理先後斜槓, 冒號等.
注意這裏的 split 只分割出最後一項(不帶斜槓).
os.path 模塊中還有許多函數容許你簡單快速地獲知文件名的一些特徵
expanduser 函數以與大部分Unix shell相同的方式處理用戶名快捷符號(~, 不過在 Windows 下工做不正常),
walk 函數會幫你找出一個目錄樹下的全部文件 (如 Example 1-46 所示). 它的參數依次是目錄名, 回調函數, 以及傳遞給回調函數的數據對象.
walk 函數的接口多少有點晦澀 (也許只是對我我的而言, 我老是記不住參數的順序). Example 1-47 中展現的 index 函數會返回一個文件名列表, 你能夠直接使用 for-in 循環處理文件.
若是你不想列出全部的文件 (基於性能或者是內存的考慮) , Example 1-48 展現了另外一種方法. 這裏 DirectoryWalker 類的行爲與序列對象類似, 一次返回一個文件. (generator?)
注意 DirectoryWalker 類並不檢查傳遞給 _ _getitem_ _ 方法的索引值. 這意味着若是你越界訪問序列成員(索引數字過大)的話, 這個類將不能正常工做.
最後, 若是你須要處理文件大小和時間戳, Example 1-49 給出了一個類, 它返回文件名和它的 os.stat 屬性(一個元組). 這個版本在每一個文件上都能節省一次或兩次 stat 調用( os.path.isdir 和 os.path.islink 內部都使用了 stat ), 而且在一些平臺上運行很快.
Example 1-50 展現了 stat 模塊的基本用法, 這個模塊包含了一些 os.stat 函數中可用的常量和測試函數.
string 模塊提供了一些用於處理字符串類型的函數.
大多數狀況下 (特別是當你使用的是1.6及更高版本時) ,你可使用 int 和 float 函數代替 string 模塊中對應的函數。
atoi 函數能夠接受可選的第二個參數, 指定數基(number base). 若是數基爲 0, 那麼函數將檢查字符串的前幾個字符來決定使用的數基: 若是爲 "0x," 數基將爲 16 (十六進制), 若是爲 "0," 則數基爲 8 (八進制). 默認數基值爲 10 (十進制), 當你未傳遞參數時就使用這個值.
在 1.6 及之後版本中, int 函數和 atoi 同樣能夠接受第二個參數. 與字符串版本函數不同的是 , int 和 float 能夠接受 Unicode 字符串對象.
re 模塊提供了一系列功能強大的正則表達式 (regular expression) 工具, 它們容許你快速檢查給定字符串是否與給定的模式匹配 (使用 match 函數), 或者包含這個模式 (使用 search 函數). 正則表達式是以緊湊(也很神祕)的語法寫出的字符串模式.
match 嘗試從字符串的起始匹配一個模式, . 若是模式匹配了某些內容 (包括空字符串, 若是模式容許的話) , 它將返回一個匹配對象. 使用它的 group 方法能夠找出匹配的內容.
search 函數會在字符串內查找模式匹配,. 它在全部可能的字符位置嘗試匹配模式, 從最左邊開始, 一旦找到匹配就返回一個匹配對象. 若是沒有找到相應的匹配, 就返回 None .
你也能夠經過回調 (callback) 函數使用 sub 來替換指定模式.
math 模塊實現了許多對浮點數的數學運算函數. 這些函數通常是對平臺 C 庫中同名函數的簡單封裝, 因此通常狀況下, 不一樣平臺下計算的結果可能稍微地有所不一樣, 有時候甚至有很大出入.
cmath 模塊包含了一些用於複數運算的函數.
operator 模塊爲 Python 提供了一個 "功能性" 的標準操做符接口. 當使用 map 以及 filter 一類的函數的時候, operator 模塊中的函數能夠替換一些lambda 函式. 並且這些函數在一些喜歡寫晦澀代碼的程序員中很流行.
這裏須要注意 operator 模塊使用很是規的方法處理對象實例. 因此使用 isNumberType , isMappingType , 以及 isSequenceType 函數的時候要當心, 這很容易下降代碼的擴展性.
一樣須要注意的是一個字符串序列成員 (單個字符) 也是序列. 因此當在遞歸函數使用 isSequenceType 來截斷對象樹的時候, 別把普通字符串做爲參數(或者是任何包含字符串的序列對象).
copy 模塊包含兩個函數, 用來拷貝對象
copy(object) => object 建立給定對象的 "淺/淺層(shallow)" 拷貝(copy). 這裏 "淺/淺層(shallow)" 的意思是複製對象自己, 但當對象是一個容器 (container) 時, 它的成員仍然指向原來的成員對象.
sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不一樣部分.
在解釋器啓動後, argv 列表包含了傳遞給腳本的全部參數. 列表的第一個元素爲腳本自身的名稱.
若是是從標準輸入讀入腳本 (好比 "python < sys-argv-example-1.py"), 腳本的名稱將被設置爲空串. 若是把腳本做爲字符串傳遞給python (使用 -c選項), 腳本名會被設置爲 "-c".
path 列表是一個由目錄名構成的列表, Python 從中查找擴展模塊( Python 源模塊, 編譯模塊,或者二進制擴展). 啓動 Python 時,這個列表從根據內建規則, PYTHONPATH 環境變量的內容, 以及註冊表( Windows 系統)等進行初始化. 因爲它只是一個普通的列表, 你能夠在程序中對它進行操做
modules 字典包含全部加載的模塊. import 語句在從磁盤導入內容以前會先檢查這個字典.
getrefcount 函數 返回給定對象的引用記數 - 也就是這個對象使用次數. Python 會跟蹤這個值, 當它減小爲0的時候, 就銷燬這個對象.
setprofiler 函數容許你配置一個分析函數(profiling function). 這個函數會在每次調用某個函數或方法時被調用(明確或隱含的), 或是遇到異常的時候被調用基於該函數, profile 模塊提供了一個完整的分析器框架.
Example 1-73 中的 settrace 函數與此相似, 可是 trace 函數會在解釋器每執行到新的一行時被調用.
基於該函數提供的跟蹤功能, pdb 模塊提供了完整的調試( debug )框架.
stdin , stdout , 以及 stderr 變量包含與標準 I/O 流對應的流對象. 若是須要更好地控制輸出,而 print 不能知足你的要求, 它們就是你所須要的. 你也能夠 替換 它們, 這時候你就能夠重定向輸出和輸入到其它設備( device ), 或者以非標準的方式處理它們.
執行至主程序的末尾時,解釋器會自動退出. 可是若是須要中途退出程序, 你能夠調用 sys.exit 函數, 它帶有一個可選的整數參數返回給調用它的程序.在 Python 2.0 之後, 你可使用 atexit 模塊來註冊多個退出處理函數.
(用於2.0版本及以上) atexit 模塊容許你註冊一個或多個終止函數(暫且這麼叫), 這些函數將在解釋器終止前被自動調用.
調用 register 函數, 即可以將函數註冊爲終止函數. 你也能夠添加更多的參數, 這些將做爲 exit 函數的參數傳遞.
該模塊實際上是一個對 sys.exitfunc 鉤子( hook )的簡單封裝.
time 模塊提供了一些處理日期和一天內時間的函數. 它是創建在 C 運行時庫的簡單封裝.
給定的日期和時間能夠被表示爲浮點型(從參考時間, 一般是 1970.1.1 到如今通過的秒數. 即 Unix 格式), 或者一個表示時間的 struct (類元組).
localtime 和 gmtime 返回的類元組包括年, 月, 日, 時, 分, 秒, 星期, 一年的第幾天, 日光標誌. 其中年是一個四位數(在有千年蟲問題的平臺上另有規定, 但仍是四位數), 星期從星期一(數字 0 表明)開始, 1月1日是一年的第一天.
你可使用標準的格式化字符串把時間對象轉換爲字符串, 不過 time 模塊已經提供了許多標準轉換函數,
在一些平臺上, time 模塊包含了 strptime 函數, 它的做用與 strftime 相反. 給定一個字符串和模式, 它返回相應的時間對象
只有在系統的 C 庫提供了相應的函數的時候, time.strptime 函數纔可使用. 對於沒有提供標準實現的平臺,
將時間元組轉換回時間值很是簡單, 至少咱們談論的當地時間 (local time) 如此. 只要把時間元組傳遞給 mktime 函數,
可是, 1.5.2 版本的標準庫沒有提供能將 UTC 時間 (Universal Time, Coordinated: 特林威治標準時間)轉換爲時間值的函數 ( Python 和對應底層 C 庫都沒有提供). Example 1-84 提供了該函數的一個 Python 實現, 稱爲 timegm .
從 1.6 版本開始, calendar 模塊提供了一個相似的函數 calendar.timegm .
time 模塊能夠計算 Python 程序的執行時間, 你能夠測量 "wall time" (real world time), 或是"進程時間" (消耗的 CPU 時間).
並非全部的系統都能測量真實的進程時間. 一些系統中(包括 Windows ), clock 函數一般測量從程序啓動到測量時的 wall time.
進程時間的精度受限制. 在一些系統中, 它超過 30 分鐘後進程會被清理. (原文: On many systems, it wraps around after just over 30 minutes.)
另參見 timing 模塊( Windows 下的朋友不用忙活了,沒有地~), 它能夠測量兩個事件之間的 wall time.
types 模塊包含了標準解釋器定義的全部類型的類型對象. 同一類型的全部對象共享一個類型對象. 你可使用 is 來檢查一個對象是否是屬於某個給定類型.
注意全部的類都具備相同的類型, 全部的實例也是同樣. 要測試一個類或者實例所屬的類, 可使用內建的 issubclass 和 isinstance 函數.
types 模塊在第一次引入的時候會破壞當前的異常狀態. 也就是說, 不要在異常處理語句塊中導入該模塊 (或其餘會導入它的模塊) .
(可選, 2.0 及之後版本) gc 模塊提供了到內建循環垃圾收集器的接口.
Python 使用引用記數來跟蹤何時銷燬一個對象; 一個對象的最後一個引用一旦消失, 這個對象就會被銷燬.
從 2.0 版開始, Python 還提供了一個循環垃圾收集器, 它每隔一段時間執行. 這個收集器查找指向自身的數據結構, 並嘗試破壞循環.
你可使用 gc.collect 函數來強制完整收集. 這個函數將返回收集器銷燬的對象的數量.
若是你肯定你的程序不會建立自引用的數據結構, 你可使用 gc.disable 函數禁用垃圾收集, 調用這個函數之後, Python 的工做方式將與 1.5.2 或更早的版本相同.
"Now, imagine that your friend kept complaining that she didn't want to visit you since she found it too hard to climb up the drain pipe, and you kept telling her to use the friggin' stairs like everyone else..."
- eff-bot, June 1998
本章敘述了許多在 Python 程序中普遍使用的模塊. 固然, 在大型的 Python 程序中不使用這些模塊也是能夠的, 但若是使用會節省你很多時間.
fileinput 模塊可讓你更簡單地向不一樣的文件寫入內容. 該模塊提供了一個簡單的封裝類, 一個簡單的 for-in 語句就能夠循環獲得一個或多個文本文件的內容.
StringIO 模塊 (以及 cStringIO 模塊, 做爲一個的變種) 實現了一個工做在內存的文件對象. 你能夠在不少地方用 StringIO 對象替換普通的文件對象.
UserDict , UserList , 以及 UserString 是對應內建類型的頂層簡單封裝. 和內建類型不一樣的是, 這些封裝是能夠被繼承的. 這在你須要一個和內建類型行爲類似但由額外新方法的類的時候頗有用.
random 模塊提供了一些不一樣的隨機數字生成器. whrandom 模塊與此類似, 但容許你建立多個生成器對象.
[!Feather 注: whrandom 在版本 2.1 時聲明不支持. 請使用 random 替代.]
md5 和 sha 模塊用於計算密寫的信息標記( cryptographically strong message signatures , 所謂的 "message digests", 信息摘要).
crypt 模塊實現了 DES 樣式的單向加密. 該模塊只在 Unix 系統下可用.
rotor 模塊提供了簡單的雙向加密. 版本 2.4 之後的朋友能夠不用忙活了.
[!Feather 注: 它在版本 2.3 時申明不支持, 由於它的加密運算不安全.]
fileinput 模塊容許你循環一個或多個文本文件的內容,
你也可使用 fileinput 模塊得到當前行的元信息 (meta information). 其中包括 isfirstline , filename , lineno ,
文本文件的替換操做很簡單. 只須要把 inplace 關鍵字參數設置爲 1 , 傳遞給 input 函數, 該模塊會幫你作好一切.
shutil 實用模塊包含了一些用於複製文件和文件夾的函數. 使用的 copy 函數使用和 Unix 下 cp 命令基本相同的方式複製一個文件.
copytree 函數用於複製整個目錄樹 (與 cp -r 相同), 而 rmtree 函數用於刪除整個目錄樹 (與 rm -r ).
tempfile 模塊容許你快速地建立名稱惟一的臨時文件供使用.
TemporaryFile 函數會自動挑選合適的文件名, 並打開文件, . 並且它會確保該文件在關閉的時候會被刪除. (在 Unix 下, 你能夠刪除一個已打開的文件, 這 時文件關閉時它會被自動刪除. 在其餘平臺上, 這經過一個特殊的封裝類實現.)
Example 2-8 展現了 StringIO 模塊的使用. 它實現了一個工做在內存的文件對象 (內存文件). 在大多須要標準文件對象的地方均可以使用它來替換.
StringIO 類實現了內建文件對象的全部方法, 此外還有 getvalue 方法用來返回它內部的字符串值.
StringIO 能夠用於從新定向 Python 解釋器的輸出
cStringIO 是一個可選的模塊, 是 StringIO 的更快速實現. 它的工做方式和 StringIO 基本相同, 可是它不能夠被繼承. Example 2-11 展現了cStringIO 的用法, 另參考前一節.
爲了讓你的代碼儘量快, 但同時保證兼容低版本的 Python ,你可使用一個小技巧在 cStringIO 不可用時啓用 StringIO 模塊
(2.0 新增) mmap 模塊提供了操做系統內存映射函數的接口, 映射區域的行爲和字符串對象相似, 但數據是直接從文件讀取的.
在 Windows 下, 這個文件必須以既可讀又可寫的模式打開( `r+` , `w+` , 或 `a+` ), 不然 mmap 調用會失敗.
[!Feather 注: 經本人測試, a+ 模式是徹底能夠的, 原文只有 r+ 和 w+]
UserDict 模塊包含了一個可繼承的字典類 (事實上是對內建字典類型的 Python 封裝).
Example 2-15 展現了一個加強的字典類, 容許對字典使用 "加/+" 操做並提供了接受關鍵字參數的構造函數.
UserList 模塊包含了一個可繼承的列表類 (事實上是對內建列表類型的 Python 封裝).
AutoList 實例相似一個普通的列表對象, 但它容許你經過賦值爲列表添加項目.
(2.0 新增) UserString 模塊包含兩個類, UserString 和 MutableString . 前者是對標準字符串類型的封裝, 後者是一個變種, 容許你修改特定位置的字符(聯想下列表就知道了).
注意 MutableString 並非效率很好, 許多操做是經過切片和字符串鏈接實現的. 若是性能很對你的腳原本說重要的話, 你最好使用字符串片段的列表或者array 模塊.
traceback 模塊容許你在程序裏打印異常的跟蹤返回 (Traceback)信息, 相似未捕獲異常時解釋器所作的.
errno 模塊定義了許多的符號錯誤碼, 好比 ENOENT ("沒有該目錄入口") 以及 EPERM ("權限被拒絕"). 它還提供了一個映射到對應平臺數字錯誤代碼的字典.
在大多狀況下, IOError 異常會提供一個二元元組, 包含對應數值錯誤代碼和一個說明字符串. 若是你須要區分不一樣的錯誤代碼, 那麼最好在可能的地方使用符號名稱.
getopt 模塊包含用於抽出命令行選項和參數的函數, 它能夠處理多種格式的選項.
其中第 2 個參數指定了容許的可縮寫的選項. 選項名後的冒號(:) 意味這這個選項必須有額外的參數.
爲了讓 getopt 查找長的選項,, 傳遞一個描述選項的列表作爲第 3 個參數. 若是一個選項名稱以等號(=) 結尾, 那麼它必須有一個附加參數.
getpass 模塊提供了平臺無關的在命令行下輸入密碼的方法.
getpass(prompt) 會顯示提示字符串, 關閉鍵盤的屏幕反饋, 而後讀取密碼. 若是提示參數省略, 那麼它將打印出 "Password:".
getuser() 得到當前用戶名, 若是可能的話.
glob 根據給定模式生成知足該模式的文件名列表, 和 Unix shell 相同.
這裏的模式和正則表達式相似, 但更簡單. 星號(*) 匹配零個或更多個字符, 問號(?) 匹配單個字符. 你也可使用方括號來指定字符範圍, 例如 [0-9] 表明一個數字. 其餘全部字符都表明它們自己.
glob(pattern) 返回知足給定模式的全部文件的列表. Example 2-26 展現了它的用法.
注意這裏的 glob 返回完整路徑名, 這點和 os.listdir 函數不一樣. glob 事實上使用了 fnmatch 模塊來完成模式匹配.
fnmatch 模塊使用模式來匹配文件名.
模式語法和 Unix shell 中所使用的相同. 星號(*) 匹配零個或更多個字符, 問號(?) 匹配單個字符. 你也可使用方括號來指定字符範圍, 例如 [0-9] 表明一個數字. 其餘全部字符都匹配它們自己.
Example 2-28 中的 translate 函數能夠將一個文件匹配模式轉換爲正則表達式.
glob 和 find 模塊在內部使用 fnmatch 模塊來實現.
"Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin."
- John von Neumann, 1951
random 模塊包含許多隨機數生成器.
基本隨機數生成器(基於 Wichmann 和 Hill , 1982 的數學運算理論) 能夠經過不少方法訪問, 如 Example 2-29 所示.
注意這裏的 randint 函數能夠返回上界, 而其餘函數老是返回小於上界的值. 全部函數都有可能返回下界值.
Example 2-30 展現了 choice 函數, 它用來從一個序列裏分揀出一個隨機項目. 它能夠用於列表, 元組, 以及其餘序列(固然, 非空的).
在 2.0 及之後版本, shuffle 函數能夠用於打亂一個列表的內容 (也就是生成一個該列表的隨機全排列). Example 2-31 展現瞭如何在舊版本中實現該函數.
random 模塊也包含了非恆定分佈的隨機生成器函數. Example 2-32 使用了 gauss (高斯)函數來生成知足高斯分的布隨機數字.
你能夠在 Python Library Reference 找到更多關於非恆定分佈隨機生成器函數的信息.
標準庫中提供的隨機數生成器都是僞隨機數生成器. 不過這對於不少目的來講已經足夠了, 好比模擬, 數值分析, 以及遊戲. 能夠肯定的是它不適合密碼學用途.
這個模塊早在 2.1 就被聲明不同意, 早廢了. 請使用 random 代替.
- Feather
Example 2-33 展現了 whrandom , 它提供了一個僞隨機數生成器. (基於 Wichmann 和 Hill, 1982 的數學運算理論). 除非你須要不共享狀態的多個生成器(如多線程程序), 請使用 random 模塊代替.
md5 (Message-Digest Algorithm 5)模塊用於計算信息密文(信息摘要).
md5 算法計算一個強壯的128位密文. 這意味着若是兩個字符串是不一樣的, 那麼有極高可能它們的 md5 也不一樣. 也就是說, 給定一個 md5 密文, 那麼幾乎沒有可能再找到另個字符串的密文與此相同. Example 2-35 展現瞭如何使用 md5 模塊.
千萬別忘記內建的僞隨機生成器對於加密操做而言並不合適. 千萬當心.
sha 模塊提供了計算信息摘要(密文)的另種方法, 如 Example 2-39 所示. 它與 md5 模塊相似, 但生成的是 160 位簽名.
(可選, 只用於 Unix) crypt 模塊實現了單向的 DES 加密, Unix 系統使用這個加密算法來儲存密碼, 這個模塊真正也就只在檢查這樣的密碼時有用.
Example 2-40 展現瞭如何使用 crypt.crypt 來加密一個密碼, 將密碼和 salt 組合起來而後傳遞給函數, 這裏的 salt 包含兩位隨機字符. 如今你能夠扔掉原密碼而只保存加密後的字符串了.
確認密碼時, 只須要用新密碼調用加密函數, 並取加密後字符串的前兩位做爲 salt 便可. 如 果結果和加密後字符串匹配, 那麼密碼就是正確的. Example 2-41使用 pwd 模塊來獲取已知用戶的加密後密碼.
這個模塊在 2.3 時被聲明不同意, 2.4 時廢了. 由於它的加密算法不安全.
- Feather
(可選) rotor 模塊實現了一個簡單的加密算法. 如 Example 2-42 所示. 它的算法基於 WWII Enigma engine.
(可選) zlib 模塊爲 "zlib" 壓縮提供支持. (這種壓縮方法是 "deflate".)
Example 2-43 展現瞭如何使用 compress 和 decompress 函數接受字符串參數.
code 模塊提供了一些用於模擬標準交互解釋器行爲的函數.
compile_command 與內建 compile 函數行爲類似, 但它會經過測試來保證你傳遞的是一個完成的 Python 語句.
在 Example 2-47 中, 咱們一行一行地編譯一個程序, 編譯完成後會執行所獲得的代碼對象 (code object). 程序代碼以下:
a = ( 1, 2, 3 ) print a
注意只有咱們到達第 2 個括號, 元組的賦值操做能編譯完成.
InteractiveConsole 類實現了一個交互控制檯, 相似你啓動的 Python 解釋器交互模式.
控制檯能夠是活動的(自動調用函數到達下一行) 或是被動的(當有新數據時調用 push 方法). 默認使用內建的 raw_input 函數. 若是你想使用另個輸入函數, 你可使用相同的名稱重載這個方法. Example 2-48 展現瞭如何使用 code 模塊來模擬交互解釋器.
"Well, since you last asked us to stop, this thread has moved from discussing languages suitable for professional programmers via accidental users to computer-phobic users. A few more iterations can make this thread really interesting..."
- eff-bot, June 1996
本章將介紹標準 Python 解釋器中所提供的線程支持模塊. 注意線程支持模塊是可選的, 有可能在一些 Python 解釋器中不可用.
本章還涵蓋了一些 Unix 和 Windows 下用於執行外部進程的模塊.
執行 Python 程序的時候, 是按照從主模塊頂端向下執行的. 循環用於重複執行部分代碼, 函數和方法會將控制臨時移交到程序的另外一部分.
經過線程, 你的程序能夠在同時處理多個任務. 每一個線程都有它本身的控制流. 因此你能夠在一個線程裏從文件讀取數據, 另個向屏幕輸出內容.
爲了保證兩個線程能夠同時訪問相同的內部數據, Python 使用了 global interpreter lock (全局解釋器鎖). 在同一時間只可能有一個線程執行 Python 代碼; Python 其實是自動地在一段很短的時間後切換到下個線程執行, 或者等待 一個線程執行一項須要時間的操做(例如等待經過 socket 傳輸的數據, 或是從文件中讀取數據).
全局鎖事實上並不能避免你程序中的問題. 多個線程嘗試訪問相同的數據會致使異常 狀態. 例如如下的代碼:
def getitem(key): item = cache.get(key) if item is None: # not in cache; create a new one item = create_new_item(key) cache[key] = item return item
若是不一樣的線程前後使用相同的 key 調用這裏的 getitem 方法, 那麼它們極可能會致使相同的參數調用兩次 create_new_item . 大多時候這樣作沒有問題, 但在某些時候會致使嚴重錯誤.
不過你可使用 lock objects 來同步線程. 一個線程只能擁有一個 lock object , 這樣就能夠確保某個時刻 只有一個線程執行 getitem 函數.
在大多現代操做系統中, 每一個程序在它自身的進程( process )內執行. 咱們經過在 shell 中鍵入命令或直接在菜單中選擇來執行一個程序/進程. Python 容許你在一個腳本內執行一個新的程序.
大多進程相關函數經過 os 模塊定義. 相關內容請參閱 第 1.4.4 小節 .
(可選) threading 模塊爲線程提供了一個高級接口, 如 Example 3-1 所示. 它源自 Java 的線程實現. 和低級的 thread 模塊相同, 只有你在編譯解釋器時打開了線程支持纔可使用它 .
你只須要繼承 Thread 類, 定義好 run 方法, 就能夠建立一 個新的線程. 使用時首先建立該類的一個或多個實例, 而後調用 start 方法. 這樣每一個實例的run 方法都會運行在它本身的線程裏.
Example 3-1 使用了 Lock 對象來在全局 Counter 對象裏建立臨界區 (critical section). 若是刪除了 acquire 和 release 語句, 那麼 Counter 極可能不會到達 100.
Queue 模塊提供了一個線程安全的隊列 (queue) 實現, . 你能夠經過它在多個線程裏安全訪問同個對象.
Example 3-3 展現瞭如何限制隊列的大小. 若是隊列滿了, 那麼控制主線程 (producer threads) 被阻塞, 等待項目被彈出 (pop off).
你能夠經過繼承 Queue 類來修改它的行爲. Example 3-4 爲咱們展現了一個簡單的具備優先級的隊列. 它接受一個元組做爲參數, 元組的第一個成員表示優先級(數值越小優先級越高).
(可選) thread 模塊提爲線程提供了一個低級 (low_level) 的接口, 只有你在編譯解釋器時打開了線程支持纔可使用它. 若是沒有特殊須要, 最好使用高級接口 threading 模塊替代.
(只用於 Unix) commands 模塊包含一些用於執行外部命令的函數.
(只用於 Unix) pipes 模塊提供了 "轉換管道 (conversion pipelines)" 的支持. 你能夠建立包含許多外部工具調用的管道來處理多個文件.
popen2 模塊容許你執行外部命令, 並經過流來分別訪問它的 stdin 和 stdout ( 可能還有 stderr ).
在 python 1.5.2 以及以前版本, 該模塊只存在於 Unix 平臺上. 2.0 後, Windows 下也實現了該函數.
你可使用 signal 模塊配置你本身的信號處理器 (signal handler), 如 Example 3-11 所示. 當解釋器收到某個信號時, 信號處理器會當即執行.
"PALO ALTO, Calif. - Intel says its Pentium Pro and new Pentium II chips have a flaw that can cause computers to sometimes make mistakes but said the problems could be fixed easily with rewritten software."
- Reuters telegram
本章描述了一些用於在 Python 對象和其餘數據表示類型間相互轉換的模塊. 這些模塊一般用於讀寫特定的文件格式或是儲存/取出 Python 變量.
Python 提供了一些用於二進制數據解碼/編碼的模塊. struct 模塊用於在 二進制數據結構(例如 C 中的 struct )和 Python 元組間轉換. array 模塊將二進制數據陣列 ( C arrays )封裝爲 Python 序列對象.
marshal 和 pickle 模塊用於在不一樣的 Python 程序間共享/傳遞數據.
marshal 模塊使用了簡單的自描述格式( Self-Describing Formats ), 它支持大多的內建數據類型, 包括 code 對象. Python 自身也使用了這個格式來儲存編譯後代碼( .pyc 文件).
pickle 模塊提供了更復雜的格式, 它支持用戶定義的類, 自引用數據結構等等. pickle 是用 Python 寫的, 相對來講速度較慢, 不過還有一個 cPickle 模塊, 使用 C 實現了相同的功能, 速度和 marshal 不相上下.
一些模塊提供了加強的格式化輸出, 用來補充內建的 repr 函數和 % 字符串格式化操做符.
pprint 模塊幾乎能夠將任何 Python 數據結構很好地打印出來(提升可讀性).
repr 模塊能夠用來替換內建同名函數. 該模塊與內建函數不一樣的是它限制了不少輸出形式: 他只會 輸出字符串的前 30 個字符, 它只打印嵌套數據結構的幾個等級, 等等.
Python 支持大部分常見二進制編碼, 例如 base64 , binhex (一種 Macintosh 格式) , quoted printable , 以及 uu 編碼.
array 模塊實現了一個有效的陣列儲存類型. 陣列和列表相似, 但其中全部的項目必須爲相同的 類型. 該類型在陣列建立時指定.
Examples 4-1 到 4-5 都是很簡單的範例. Example 4-1 建立了一個 array 對象, 而後使用 tostring 方法將內部緩衝區( internal buffer )複製到字符串.
struct 模塊用於轉換二進制字符串和 Python 元組. pack 函數接受格式字符串以及額外參數, 根據指定格式將額外參數轉換爲二進制字符串. upack 函數接受一個字符串做爲參數, 返回一個元組.
xdrlib 模塊用於在 Python 數據類型和 Sun 的 external data representation (XDR) 間相互轉化
marshal 模塊能夠把不連續的數據組合起來 - 與字符串相互轉化, 這樣它們就能夠寫入文件或是在網絡中傳輸.
marshal 模塊使用了簡單的自描述格式. 對於每一個數據項目, 格式化後的字符串都包含一個類型代碼, 而後是一個或多個類型標識區域. 整數使用小字節序( little-endian order )儲存, 字符串儲存時和它自身內容長度相同(可能包含空字節), 元組由組成它的對象組合表示.
pickle 模塊同 marshal 模塊相同, 將數據連續化, 便於保存傳輸. 它比 marshal 要慢一些, 但它能夠處理類實例, 共享的元素, 以及遞歸數據結構等.
(可選, 注意大小寫) cPickle 模塊是針對 pickle 模塊的一個更快的實現.
你可使用 copy_reg 模塊註冊你本身的擴展類型. 這樣 pickle 和 copy 模塊就會知道 如何處理非標準類型.
咱們能夠註冊一個 code 對象處理器來完成目標. 處理器應包含兩個部分: 一個 pickler , 接受 code 對象 並返回一個只包含簡單數據類型的元組, 以及一個unpickler , 做用相反, 接受這樣的元組做爲參數.
若是你是在網絡中傳輸 pickle 後的數據, 那麼請確保自定義的 unpickler 在數據接收端也是可用的.
pprint 模塊( pretty printer )用於打印 Python 數據結構. 當你在命令行下打印 特定數據結構時你會發現它頗有用(輸出格式比較整齊, 便於閱讀).
repr 模塊提供了內建 repr 函數的另個版本. 它限制了不少(字符串長度, 遞歸等).
base64 編碼體系用於將任意二進制數據轉換爲純文本. 它將一個 3 字節的二進制字節組 轉換爲 4 個文本字符組儲存, 並且規定只容許如下集合中的字符出現:
binhex 模塊用於到 Macintosh BinHex 格式的相互轉化.
該模塊有兩個函數 binhex 和 hexbin .
quopri 模塊基於 MIME 標準實現了引用的可打印編碼( quoted printable encoding ).
這樣的編碼能夠將不包含或只包含一部分U.S. ASCII 文本的信息, 例如大多歐洲語言, 中文, 轉換爲只包含 U.S. ASCII 的信息. 在一些老式的 mail 代理中你會發現這頗有用, 由於它們通常不支持特殊.
uu 編碼體系用於將任意二進制數據轉換爲普通文本格式. 該格式在新聞組中很流行, 但逐漸被 base64 編碼取代.
uu 編碼將每一個 3 字節( 24 位)的數據組轉換爲 4 個可打印字符(每一個字符 6 位), 使用從 chr(32) (空格) 到 chr(95) 的字符. uu 編碼一般會使數據大小增長 40% .
一個編碼後的數據流以一個新行開始, 它包含文件的權限( Unix 格式)和文件名, 以 end 行結尾:
begin 666 sample.jpg M_]C_X 02D9)1@ ! 0 0 ! #_VP!# @&!@<&!0@'!P<)'0@*#!0-# L+ ...more lines like this... end
uu 模塊提供了兩個函數: encode 和 decode .
encode(infile, outfile, filename) 函數從編碼輸入文件中的數據, 而後寫入到輸出文件中. . infile 和 outfile 能夠是文件名或文件對象. filename 參數做爲起始域的文件名寫入.
binascii 提供了多個編碼的支持函數, 包括 base64 , binhex , 以及 uu . 2.0 及之後版本中, 你還可使用它在二進制數據和十六進制字符串中相互轉換.
本章將描述用於處理不一樣文件格式的模塊.
Python 提供了一些用於處理可擴展標記語言( Extensible Markup Language , XML ) 和超文本標記語言( Hypertext Markup Language , HTML )的擴展. Python 一樣提供了對 標準通用標記語言( Standard Generalized Markup Language , SGML )的支持.
全部這些格式都有着相同的結構, 由於 HTML 和 XML 都來自 SGML . 每一個文檔都是由 起始標籤( start tags ), 結束標籤( end tags ), 文本(又叫字符數據), 以及實體引用( entity references )構成:
<document name="sample.xml"> <header>This is a header</header> <body>This is the body text. The text can contain plain text ("character data"), tags, and entities. </body> </document>
在這個例子中, <document>, <header>, 以及 <body> 是起始標籤. 每一個起始標籤都有一個對應的結束標籤, 使用斜線 "/" 標記. 起始標籤能夠包含多個屬性, 好比這裏的 name 屬性.
起始標籤和它對應的結束標籤中的任何東西被稱爲 元素( element ). 這裏 document 元素包含 header 和 body 兩個元素.
" 是一個字符實體( character entity ). 字符實體用於在文本區域中表示特殊的保留字符, 使用 & 指示. 這裏它表明一個引號, 常見字符實體還有 " < ( < )" 和 " > ( > )" .
雖然 XML , HTML , SGML 使用相同的結構塊, 但它們還有一些不一樣點. 在 XML 中, 全部元素必須有起始和結束標籤, 全部標籤必須正確嵌套( well-formed ). 並且 XML 是區分大小寫的, 因此 <document> 和 <Document> 是不一樣的元素類型.
HTML 有很高靈活性, HTML 語法分析器通常會自動補全缺失標籤; 例如, 當遇到一個以 <P> 標籤開始的新段落, 卻沒有對應結束標籤, 語法分析器會自動添加一個 </P> 標籤. HTML 也是區分大小寫的. 另外一方面, XML 容許你定義任何元素, 而 HTML 使用一些由 HTML 規範定義的固定元素.
SGML 有着更高的靈活性, 你可使用本身的聲明( declaration ) 定義源文件如何轉換到元素結構, DTD ( document type description , 文件類型定義)能夠用來 檢查結構並補全缺失標籤. 技術上來講, HTML 和 XML 都是 SGML 應用, 有各自的 SGML 聲明, 並且 HTML 有一個標準 DTD .
Python 提供了多個 makeup 語言分析器. 因爲 SGML 是最靈活的格式, Python 的 sgmllib 事實上很簡單. 它不會去處理 DTD , 不過你能夠繼承它來提供更復雜的功能.
Python 的 HTML 支持基於 SGML 分析器. htmllib 將具體的格式輸出工做交給 formatter 對象. formatter 模塊包含一些標準格式化標誌.
Python 的 XML 支持模塊很複雜. 先前是隻有與 sgmllib 相似的 xmllib , 後來加入了更高級的 expat 模塊(可選). 而最新版本中已經準備廢棄 xmllib ,啓用 xml 包做爲工具集.
ConfigParser 模塊用於讀取簡單的配置文件, 相似 Windows 下的 INI 文件.
netrc 模塊用於讀取 .netrc 配置文件, shlex 模塊用於讀取相似 shell 腳本語法的配置文件.
Python 的標準庫提供了對 GZIP 和 ZIP ( 2.0 及之後) 格式的支持. 基於 zlib 模塊, gzip 和 zipfile 模塊分別用來處理這類文件.
xmllib 已在當前版本中申明不支持.
xmlib 模塊提供了一個簡單的 XML 語法分析器, 使用正則表達式將 XML 數據分離, 語法分析器只對文檔作基本的檢查, 例如是否只有一個頂層元素, 全部的標籤是否匹配.
XML 數據一塊一塊地發送給 xmllib 分析器(例如在網路中傳輸的數據). 分析器在遇到起始標籤, 數據區域, 結束標籤, 和實體的時候調用不一樣的方法.
若是你只是對某些標籤感興趣, 你能夠定義特殊的 start_tag 和 end_tag 方法, 這裏 tag 是標籤名稱. 這些 start 函數使用它們對應標籤的屬性做爲參數調用(傳遞時爲一個字典).
(可選) xml.parsers.expat 模塊是 James Clark's Expat XML parser 的接口.
sgmllib 模塊, 提供了一個基本的 SGML 語法分析器. 它與 xmllib 分析器基本相同, 但限制更少(並且不是很完善).
和在 xmllib 中同樣, 這個分析器在遇到起始標籤, 數據區域, 結束標籤以及實體時調用內部方法. 若是你只是對某些標籤感興趣, 那麼你能夠定義特殊的方法.
咱們使用列表保存全部起始標籤, 而後檢查每一個結束標籤是否匹配前個起始標籤. 最後確認到達文件末尾時沒有未關閉的標籤.
htmlib 模塊包含了一個標籤驅動的( tag-driven ) HTML 語法分析器, 它會將數據發送至一個格式化對象. 更多關於如何解析 HTML 的例子請參閱 formatter 模塊.
若是你只是想解析一個 HTML 文件, 而不是將它交給輸出設備, 那麼 sgmllib 模塊會是更好的選擇.
htmlentitydefs 模塊包含一個由 HTML 中 ISO Latin-1 字符實體構成的字典.
formatter 模塊提供了一些可用於 htmllib 的格式類( formatter classes ).
這些類有兩種, formatter 和 writer . formatter 將 HTML 解析器的標籤和數據流轉換爲適合輸出設備的事件流( event stream ), 而 writer 將事件流輸出到設備上.
大多狀況下, 你可使用 AbstractFormatter 類進行格式化. 它會根據不一樣的格式化事件調用 writer 對象的方法. AbstractWriter 類在每次方法調用時打印一條信息.
ConfigParser 模塊用於讀取配置文件.
配置文件的格式與 Windows INI 文件相似, 能夠包含一個或多個區域( section ), 每一個區域能夠有多個配置條目.
這裏有個樣例配置文件
[book] title: The Python Standard Library author: Fredrik Lundh email: fredrik@pythonware.com version: 2.0-001115 [ematter] pages: 250 [hardcopy] pages: 350
netrc 模塊能夠用來解析 .netrc 配置文件, 如 Example 5-18 所示. 該文件用於在用戶的 home 目錄儲存 FTP 用戶名和密碼. (別忘記設置這個文件的屬性爲: "chmod 0600 ~/.netrc," 這樣只有當前用戶能訪問).
shlex 模塊爲基於 Unix shell 語法的語言提供了一個簡單的 lexer (也就是 tokenizer).
( 2.0 新增) zipfile 模塊能夠用來讀寫 ZIP 格式.
使用 namelist 和 infolist 方法能夠列出壓縮檔的內容, 前者返回由文件名組成的列表, 後者返回由 ZipInfo 實例組成的列表.
調用 read 方法就能夠從 ZIP 文檔中讀取數據. 它接受一個文件名做爲參數, 返回字符串.
向壓縮檔加入文件很簡單, 將文件名, 文件在 ZIP 檔中的名稱傳遞給 write 方法便可.
write 方法的第三個可選參數用於控制是否使用壓縮. 默認爲 zipfile.ZIP_STORED , 意味着只是將數據儲存在檔案裏而不進行任何壓縮. 若是安裝了zlib 模塊, 那麼就可使用 zipfile.ZIP_DEFLATED 進行壓縮.
zipfile 模塊也能夠向檔案中添加字符串. 不過, 這須要一點技巧, 你須要建立一個 ZipInfo 實例, 並正確配置它.
gzip 模塊用來讀寫 gzip 格式的壓縮文件,
"To be removed from our list of future commercial postings by [SOME] PUBLISHING COMPANY an Annual Charge of Ninety Five dollars is required. Just send $95.00 with your Name, Address and Name of the Newsgroup to be removed from our list."
- Newsgroup spammer, July 1996
"想要退出 '某' 宣傳公司的將來商業廣告列表嗎, 您須要付 95 美圓. 只要您支付95美圓, 而且告訴咱們您的姓名, 地址, 和須要退出的新聞組, 咱們就會把您從列表中移除."
- 新聞組垃圾發送者, 1996 年 7 月
Python 有大量用於處理郵件和新聞組的模塊, 其中包括了許多常見的郵件格式.
rfc822 模塊包括了一個郵件和新聞組的解析器 (也可用於其它符合 RFC 822 標準的消息, 好比 HTTP 頭).
一般, RFC 822 格式的消息包含一些標頭字段, 後面至少有一個空行, 而後是信息主體.
消息解析器讀取標頭字段後會返回一個以消息標頭爲鍵的類字典對象, 地址字段被解析爲 (實際名稱, 郵件地址) 這樣的元組. 數據字段被解析爲 9 元時間元組, 可使用 time 模塊處理.
多用途因特網郵件擴展 ( Multipurpose Internet Mail Extensions, MIME ) 標準定義瞭如何在 RFC 822 格式的消息中儲存非 ASCII 文本, 圖像以及其它數據.
mimetools 模塊包含一些讀寫 MIME 信息的工具. 它還提供了一個相似 rfc822 模塊中 Message 的類, 用於處理 MIME 編碼的信息.
MimeWriter 模塊用於生成符合 MIME 郵件標準的 "多部分" 的信息
mailbox 模塊用來處理各類不一樣類型的郵箱格式. 大部分郵箱格式使用文本文件儲存純 RFC 822 信息, 用分割行區別不一樣的信息.
mailcap 模塊用於處理 mailcap 文件, 該文件指定了不一樣的文檔格式的處理方法( Unix 系統下).
mimetypes 模塊能夠判斷給定 url ( uniform resource locator , 統一資源定位符) 的 MIME 類型. 它基於一個內建的表, 還可能搜索 Apache 和 Netscape 的配置文件.
(已廢棄) packmail 模塊能夠用來建立 Unix shell 檔案. 若是安裝了合適的工具, 那麼你就能夠直接經過運行來解開這樣的檔案.注意, 這個模塊不能處理二進制文件, 例如聲音或者圖像文件.
mimify 模塊用於在 MIME 編碼的文本信息和普通文本信息(例如 ISO Latin 1 文本)間相互轉換. 它能夠用做命令行工具, 或是特定郵件代理的轉換過濾器:
multifile 模塊容許你將一個多部分的 MIME 信息的每部分做爲單獨的文件處理.
"Increasingly, people seem to misinterpret complexity as sophistication, which is baffling - the incomprehensible should cause suspicion rather than admiration. Possibly this trend results from a mistaken belief that using a somewhat mysterious device confers an aura of power on the user."
- Niklaus Wirth
本章描述了 Python 的 socket 協議支持以及其餘創建在 socket 模塊上的網絡 模塊. 這些包含了對大多流行 Internet 協議客戶端的支持, 以及一些可用來 實現 Internet 服務器的框架.
對於那些本章中的底層的例子, 我將使用兩個協議做爲樣例: Internet Time Protocol ( Internet 時間協議 ) 以及 Hypertext Transfer Protocol (超文本傳輸協議, HTTP 協議).
Internet 時間協議 ( RFC 868, Postel 和 Harrenstien, 1983) 可讓 一個網絡客戶端得到一個服務器的當前時間.
由於這個協議是輕量級的, 許多 Unix 系統(但不是全部)都提供了這個服務. 它多是最簡單的網絡協議了. 服務器等待鏈接請求並在鏈接後返回當前時間 ( 4 字節整數, 自從 1900 年 1 月 1 日到當前的秒數).
超文本傳輸協議 ( HTTP, RFC 2616 ) 是另個徹底不一樣的東西. 最近的格式說明書( Version 1.1 )超過了 100 頁.
從它最簡單的格式來看, 這個協議是很簡單的. 客戶端發送以下的請求到服務器, 請求一個文件:
GET /hello.txt HTTP/1.0 Host: hostname User-Agent: name [optional request body , 可選的請求正文]
服務器返回對應的響應:
HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 7 Hello
請求和響應的 headers (報頭)通常會包含更多的域, 可是請求 header 中的 Host 域/字段是必須提供的.
header 行使用 "/r/n" 分割, 並且 header 後必須有一個空行, 即便沒有正文 (請求和響應都必須符合這條規則).
剩下的 HTTP 協議格式說明書細節, 例如內容協商, 緩存機制, 保持鏈接, 等等, 請參閱 Hypertext TransferProtocol - HTTP/1.1 ( http://www.w3.org/Protocols).
socket 模塊實現了到 socket 通信層的接口. 你可使用該模塊建立 客戶端或是服務器的 socket .
咱們首先以一個客戶端爲例, Example 7-1 中的客戶端鏈接到一個時間協議服務器, 讀取 4 字節的返回數據, 並把它轉換爲一個時間值.
socket 工廠函數( factory function )根據給定類型(該例子中爲 Internet stream socket , 即就是 TCP socket )建立一個新的 socket . connect 方法嘗試將這個 socket 鏈接到指定服務器上. 成功後, 就可使用 recv 方法讀取數據.
建立一個服務器 socket 使用的是相同的方法, 不過這裏不是鏈接到服務器, 而是將 socket bind (綁定)到本機的一個端口上, 告訴它去監聽鏈接請求, 而後儘快處理每一個到達的請求.
Example 7-2 建立了一個時間服務器, 綁定到本機的 8037 端口( 1024 前的全部端口 是爲系統服務保留的, Unix 系統下訪問它們你必需要有 root 權限).
listen 函數的調用告訴 socket 咱們指望接受鏈接. 參數表明鏈接 的隊列(用於在程序沒有處理前保持鏈接)大小. 最後 accept 循環將當前時間返回 給每一個鏈接的客戶端.
注意這裏的 accept 函數返回一個新的 socket 對象, 這個對象是直接鏈接到客戶端 的. 而原 socket 只是用來保持鏈接; 全部後來的數據傳輸操做都使用新的 socket .
咱們可使用 Example 7-3 , ( Example 7-1 的通用化版本)來測試這個服務器, .
Example 7-3 所示的腳本也能夠做爲模塊使用; 你只須要導入 timeclient 模塊, 而後調用它的 gettime 函數.
目前爲止, 咱們已經使用了流( TCP ) socket . 時間協議還提到了 UDP sockets (報文). 流 socket 的工做模式和電話線相似; 你會知道在遠端 是否有人拿起接聽器, 在對方掛斷的時候你也會注意到. 相比之下, 發送報文更像 是在一間黑屋子裏大聲喊. 可能某人會在那裏, 但你只有在他回覆的時候纔會知道.
如 Example 7-4 所示, 你不須要在經過報文 socket 發送數據時鏈接遠程機器. 只需使用 sendto 方法, 它接受數據和接收者地址做爲參數. 讀取報文的時候使用 recvfrom 方法.
這裏的 recvfrom 返回兩個值: 數據和發送者的地址. 後者用於發送回覆數據.
最主要的不一樣在於服務器使用 bind 來分配一個已知端口給 socket , 根據 recvfrom 函數返回的地址向客戶端發送數據.
select 模塊容許你檢查一個或多個 socket , 管道, 以及其餘流兼容對象所接受的數據, 如 Example 7-6 所示.
你能夠將一個或更多 socket 傳遞給 select 函數, 而後等待它們狀態改變(可讀, 可寫, 或是發送錯誤信號):
在 Example 7-6 中, 咱們等待監聽 socket 變成可讀狀態, 這表明有一個鏈接請求到達. 咱們用和以前同樣的方法處理 channel socket , 由於它不可能由於等待 4 字節而填充網絡 緩衝區. 若是你須要向客戶端發送大量的數據, 那麼你應該在循環的頂端把數據加入到 is_writable 列表中, 而且只在 select 容許的狀況下寫入.
若是你設置 socket 爲非阻塞模式(經過調用 setblocking 方法), 那麼你就可使用 select 來等待 socket 鏈接. 不過 asyncore 模塊(參見下一節)提供了一個強大的框架, 它自動爲你處理好了這一切. 因此我不許備在這裏多說什麼, 看下一節吧.
asyncore 模塊提供了一個 "反饋性的( reactive )" socket 實現. 該模塊容許你定義特定過程完成後所執行的代碼, 而不是建立 socket 對象, 調用它們的方法. 你只須要繼承 dispatcher 類, 而後重載以下方法 (能夠選擇重載某一個或多個)就能夠實現異步的 socket 處理器.
Example 7-7 展現了一個時間客戶端, 和 socket 模塊中的那個相似.
若是你不想記錄任何信息, 那麼你能夠在你的 dispatcher 類裏重載 log 方法.
Example 7-8 展現了對應的時間服務器. 注意這裏它使用了兩個 dispatcher 子類, 一個用於監聽 socket , 另個用於與客戶端通信.
除了 dispatcher 外, 這個模塊還包含一個 dispatcher_with_send 類. 你可使用這個類發送大量的數據而不會阻塞網絡通信緩衝區.
Example 7-9 中的模塊經過繼承 dispatcher_with_send 類定義了一個 AsyncHTTP 類. 當你建立一個它的實例後, 它會發出一個 HTTP GET 請求並把 接受到的數據發送到一個 "consumer" 目標對象
若是服務器返回狀態 301 (永久重定向) 或者是 302 (臨時重定向), 重定向的 consumer 會關閉當前請求並向新地址發出新請求. 全部對 consumer 的其餘調用傳遞給原來的 consumer .
asynchat 模塊是對 asyncore 的一個擴展. 它提供對面向行( line-oriented )的協議的額外支持. 它還提供了加強的緩衝區支持(經過 push 方法和 "producer" 機制.
現了一個很小的 HTTP 服務器. 它只是簡單地返回包含 HTTP 請求信息的 HTML 文檔(瀏覽器窗口出現的輸出).
producer 接口容許你傳入( "push" )太大以致於沒法在內存中儲存的對象. asyncore 在須要更多數據的時候自動調用 producer 的 more 方法. 另外, 它使用一個空字符串標記文件的末尾.
urlib 模塊爲 HTTP , FTP , 以及 gopher 提供了一個統一的客戶端接口. 它會自動地根據 URL 選擇合適的協議處理器.
從 URL 獲取數據是很是簡單的. 只須要調用 urlopen 方法, 而後從返回的流對象中讀取數據便可,
這個流對象提供了一些非標準的屬性. headers 是一個 Message 對象(在 mimetools 模塊中定義), url 是實際的 URL . 後者會根據服務器的重定向而更新.
urlopen 函數其實是一個輔助函數, 它會建立一個 FancyURLopener 類的實例並調用它的 open 方法. 你也能夠繼承這個類來完成特殊的行爲.
urlparse 模塊包含用於處理 URL 的函數, 能夠在 URL 和平臺特定的文件名間相互轉換.
一個常見用途就是把 HTTP URL 分割爲主機名和路徑組件(一個 HTTP 請求會涉及到 主機名以及請求路徑),
(2.0 中新增) 該模塊爲 HTTP 客戶端和服務器提供了基本的 cookie 支持.
(2.0 中新增) robotparser 模塊用來讀取 robots.txt 文件, 該文件用於 Robot Exclusion Protocol (搜索機器人排除協議?http://info.webcrawler.com/mak/projects/robots/robots.html).
若是你實現的一個 HTTP 機器人會訪問網路上的任意站點(並不僅是你本身的站點), 那麼最好仍是用該模塊檢查下你所作的一切是否是受歡迎的.
ftplib 模塊包含了一個 File Transfer Protocol (FTP , 文件傳輸協議)客戶端的實現.
gopherlib 模塊包含了一個 gopher 客戶端實現,
httplib 模塊提供了一個 HTTP 客戶端接口
注意 httplib 提供的 HTTP 客戶端在等待服務器回覆的時候會阻塞程序. 異步的解決方法請參閱 asyncore 模塊中的例子.
httplib 能夠用來發送其餘 HTTP 命令, 例如 POST , .
poplib 模塊提供了一個 Post Office Protocol ( POP3 協議) 客戶端實現. 這個協議用來從郵件服務器 "pop" (拷貝) 信息到你的我的電腦.
imaplib 模塊提供了一個 Internet Message Access Protocol ( IMAP, Internet 消息訪問協議) 的客戶端實現. 這個協議容許你訪問郵件服務器的郵件目錄, 就好像是在本機訪問同樣.
smtplib 模塊提供了一個 Simple Mail Transfer Protocol ( SMTP , 簡單郵件傳輸協議) 客戶端實現. 該協議用於經過 Unix 郵件服務器發送郵件,
讀取郵件請使用 poplib 或 imaplib 模塊.
telnetlib 模塊提供了一個 telnet 客戶端實現.
nntplib 模塊提供了一個網絡新聞傳輸協議( Network News Transfer Protocol, NNTP )客戶端的實現.
重新聞服務器上讀取消息以前, 你必須鏈接這個服務器並選擇一個新聞組.
SocketServer 爲各類基於 socket 的服務器提供了一個框架. 該模塊提供了大量的類, 你能夠用它們來建立不一樣的服務器.
這是一個創建在 SocketServer 框架上的基本框架, 用於 HTTP 服務器.
在每次從新載入頁面時會生成一條隨機信息. path 變量包含當前 URL , 你可使用它爲不一樣的 URL 生成不一樣的內容 (訪問除根目錄的其餘任何 path 該腳本都會返回一個錯誤頁面).
更有擴展性的 HTTP 框架請參閱 SimpleHTTPServer 和 CGIHTTPServer 模塊.
SimpleHTTPServer 模塊是一個簡單的 HTTP 服務器, 它提供了標準的 GET 和 HEAD 請求處理器. 客戶端請求的路徑名稱會被翻譯爲一個相對文件名 (相對於服務器啓動時的當前路徑).
這個服務器會忽略驅動器符號和相對路徑名(例如 `..`). 但它並無任何訪問驗證處理, 因此請當心使用.
CGIHTTPServer 模塊是一個能夠經過公共網關接口( common gateway interface , CGI )調用外部腳本的 HTTP 服務器.
cgi 模塊爲 CGI 腳本提供了函數和類支持. 它還能夠處理 CGI 表單數據.
(2.0 中新增) webbrowser 模塊提供了一個到系統標準 web 瀏覽器的接口. 它提供了一個 open 函數, 接受文件名或 URL 做爲參數, 而後在瀏覽器中打開它. 若是你又一次調用 open 函數, 那麼它會嘗試在相同的窗口打開新頁面.
在 Unix 下, 該模塊支持 lynx , Netscape , Mosaic , Konquerer , 和 Grail . 在 Windows 和 Macintosh 下, 它會調用標準瀏覽器 (在註冊表或是 Internet 選項面板中定義).
locale 模塊提供了 C 本地化( localization )函數的接口, 同時提供相關函數, 實現基於當前 locale 設置的數字, 字符串轉換. (而 int ,float , 以及 string 模塊中的相關轉換函數不受 locale 設置的影響.)
( 2.0 中新增) unicodedata 模塊包含了 Unicode 字符的屬性, 例如字符類別, 分解數據, 以及數值.
(僅適用於 2.0 ) ucnhash 模塊爲一些 Unicode 字符代碼提供了特定的命名. 你能夠直接使用 /N{} 轉義符將 Unicode 字符名稱映射到字符代碼上.
"Wot? No quote?"
- Guido van Rossum
Python 提供了一些用於處理圖片和音頻文件的模塊.
另請參閱 Pythonware Image Library ( PIL , http://www.pythonware.com/products/pil/ ), 以及 PythonWare Sound Toolkit (PST ,http://www.pythonware.com/products/pst/ ).
譯註: 別參閱 PST 了, 廢了, 用 pymedia 代替吧.
imghdr 模塊可識別不一樣格式的圖片文件. 當前版本能夠識別 bmp , gif , jpeg , pbm , pgm , png , ppm , rast (Sun raster), rgb (SGI), tiff , 以及 xbm圖像.
sndhdr 模塊, 可來識別不一樣的音頻文件格式, 並提取文件內容相關信息.執行成功後, what 函數將返回一個由文件類型, 採樣頻率, 聲道數, 音軌數和每一個採樣點位數組成的元組. 具體含義請參考 help(sndhdr) .
(已廢棄) whatsound 是 sndhdr 模塊的一個別名.
aifc 模塊用於讀寫 AIFF 和 AIFC 音頻文件(在 SGI 和 Macintosh 的計算機上使用).
sunau 模塊用於讀寫 Sun AU 音頻文件.
sunaudio 模塊用於識別 Sun AU 音頻文件, 並提取其基本信息. sunau 模塊爲 Sun AU 文件提供了更完成的支持. 如 Example 9-6 所示
wave 模塊用於讀寫 Microsoft WAV 音頻文件.
(只用於 Unix) audiodev 爲 Sun 和 SGI 計算機提供了音頻播放支持.
(只用於 Windows ) winsound 模塊容許你在 Winodws 平臺上播放 Wave 文件. 如 Example 9-9 所示.
flag 變量說明:
"Unlike mainstream component programming, scripts usually do not introduce new components but simply 'wire' existing ones. Scripts can be seen as introducing behavior but no new state ... Of course, there is nothing to stop a 'scripting' language from introducing persistent state — it then simply turns into a normal programming language."
- Clemens Szyperski, in Component Software
Python 提供了多種類似數據庫管理( database manager )的驅動, 它們的模型都基於 Unix 的 dbm 庫. 這些數據庫和普通的字典對象相似, 但這裏須要注意的是它只能接受字符串做爲鍵和值. ( shelve 模塊能夠處理任何類型的值)
anydbm 模塊爲簡單數據庫驅動提供了統一標準的接口.
當第一次被導入的時候, anydbm 模塊會自動尋找一個合適的數據庫驅動, 按照 dbhash , gdbm , dbm , 或 dumbdbm 的順序嘗試. 若是沒有找到任何模塊, 它將引起一個 ImportError 異常.
open 函數用於打開或建立一個數據庫(使用導入時找到的數據庫驅動),
whichdb 模塊能夠判斷給定數據庫文件的格式,
shelve 模塊使用數據庫驅動實現了字典對象的持久保存. shelve 對象使用字符串做爲鍵, 但值能夠是任意類型, 全部能夠被 pickle 模塊處理的對象均可以做爲它的值.
(可選) dbhash 模塊爲 bsddb 數據庫驅動提供了一個 dbm 兼容的接口.
(可選) dbm 模塊提供了一個到 dbm 數據庫驅動的接口(在許多 Unix 平臺上均可用). 如 Example 10-6 所示.
dumbdbm 模塊是一個簡單的數據庫實現, 與 dbm 一類類似, 但使用純 Python 實現. 它使用兩個文件: 一個二進制文件 (.dat) 用於儲存數據, 一個文本文件 (.dir) 用於數據描述.
(可選) gdbm 模塊提供了到 GNU dbm 數據驅動的接口,
標準庫中有一些模塊既可用做模塊又能夠做爲命令行實用程序.
dis 模塊是 Python 的反彙編器. 它能夠把字節碼轉換爲更容易讓人看懂的格式.
你能夠從命令行調用反彙編器. 它會編譯給定的腳本並把反彙編後的字節代碼輸出到終端上:
$ dis.py hello.py 0 SET_LINENO 0 3 SET_LINENO 1 6 LOAD_CONST 0 ('hello again, and welcome to the show') 9 PRINT_ITEM 10 PRINT_NEWLINE 11 LOAD_CONST 1 (None) 14 RETURN_VALUE
固然 dis 也能夠做爲模塊使用. dis 函數接受一個類, 方法, 函數, 或者 code 對象 做爲單個參數.
pdb 模塊是標準 Python 調試器( debugger ). 它基於 bdb 調試器框架.
你能夠從命令行調用調試器 (鍵入 n 或 進入下一行代碼, 鍵入 help 得到可用命令列表):
$ pdb.py hello.py > hello.py(0)?() (Pdb) n > hello.py() (Pdb) n hello again, and welcome to the show --Return-- > hello.py(1)?()->None (Pdb)
bdb 模塊爲提供了一個調試器框架. 你可使用它來建立自定義的調試器, 你須要作的只是繼承 Bdb 類, 覆蓋它的 user 方法(在每次調試器中止的時候被調用). 使用各類各樣的 set 方法能夠控制調試器.
profile 模塊是標準 Python 分析器.
和反彙編器, 調試器相同, 你能夠從命令行調用分析器:
$ profile.py hello.py hello again, and welcome to the show 3 function calls in 0.785 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 0.002 0.002 <string>:1(?) 1 0.001 0.001 0.001 0.001 hello.py:1(?) 1 0.783 0.783 0.785 0.785 profile:0(execfile('hello.py')) 0 0.000 0.000 profile:0(profiler)
咱們還能夠從程序中調用 profile 來對程序性能作分析.
你可使用 pstats 模塊來修改結果報告的形式.
pstats 模塊用於分析 Python 分析器收集的數據.
(2.0 新增) tabnanny 模塊用於檢查 Python 源文件中的含糊的縮進. 當文件混合了 tab 和空格兩種縮進時候, nanny (保姆)會當即給出提示.
在下邊使用的 badtabs.py 文件中, if 語句後的第一行使用 4 個空格和 1 個 tab . 第二行只使用了空格.
$ tabnanny.py -v samples/badtabs.py ';samples/badtabs.py': *** Line 3: trouble in tab city! *** offending line: print "world" indent not equal e.g. at tab sizes 1, 2, 3, 5, 6, 7, 9
由於 Python 解釋器把 tab 做爲 8 個空格來處理, 因此這個腳本能夠正常運行. 在全部符合代碼標準(一個 tab 爲 8 個空格)的編輯器中它也會正常顯示. 固然, 這些都騙不過 nanny .
將 sys.stdout 重定向到一個 StringIO 對象就能夠捕獲輸出.
本章介紹了一些平臺相關的模塊. 重點放在了適用於整個平臺家族的模塊上. (好比 Unix , Windows 家族)
(只用於 Unix) fcntl 模塊爲 Unix上的 ioctl 和 fcntl 函數提供了一個接口. 它們用於文件句柄和 I/O 設備句柄的 "out of band" 操做, 包括讀取擴展屬性, 控制阻塞. 更改終端行爲等等. (out of band management: 指使用分離的渠道進行設備管理. 這使系統管理員能在機器關機的時候對服務器, 網絡進行監視和管理. 出處: http://en.wikipedia.org/wiki/Out-of-band_management )
關於如何在平臺上使用這些函數, 請查閱對應的 Unix man 手冊.
該模塊同時提供了 Unix 文件鎖定機制的接口. 輸出結果是由同時運行 3 個副本獲得的. 像這樣(都在一句命令行裏):
python fcntl-example-1.py& python fcntl-example-1.py& python fcntl-example-1.py&
若是你註釋掉對 flock 的調用, 那麼 counter 文件不會正確地更新.
(只用於 Unix) pwd 提供了一個到 Unix 密碼/password "數據庫"( /etc/passwd 以及相關文件 )的接口. 這個數據庫(通常是一個純文本文件)包含本地機器用戶帳戶的信息.
getpwall 函數返回一個包含全部可用用戶數據庫入口的列表. 你可使用它搜索一個用戶.
當須要查詢不少名稱的時候, 你可使用 getpwall 來預加載一個字典,
(只用於 Unix) grp 模塊提供了一個到 Unix 用戶組/group ( /etc/group )數據庫的接口. getgrgid 函數返回給定用戶組 id 的相關數據,getgrnam 返回給定用戶組名稱的相關數據.
getgrall 函數返回包含全部可用用戶組數據庫入口的列表.
若是須要執行不少用戶組查詢, 你可使用 getgrall 來把當前全部的用戶組複製到一個字典裏, 這能夠節省一些時間.
(只用於 Unix , 可選) termios 爲 Unix 的終端控制設備提供了一個接口. 它可用於控制終端通信端口的大多方面.
(只用於 Unix) tty 模塊包含一些用於處理 tty 設備的工具函數.
(只用於 Unix , 可選) resource 模塊用於查詢或修改當前系統資源限制設置.
(只用於 Unix 可選) syslog 模塊用於向系統日誌設備發送信息( syslogd ). 這些信息如何處理依不一樣的系統而定, 一般會被記錄在一個 log 文件中, 例如/var/log/messages , /var/adm/syslog , 或者其餘相似處理. (若是你找不到這個文件, 請聯繫你的系統管理員).
(只用於 Windows/DOS ) msvcrt 模塊用於訪問 Microsoft Visual C/C++ Runtime Library (MSVCRT) 中函數的方法.
(非直接使用模塊, 只用於 Windows ) nt 模塊是 os 模塊在 Windows 平臺下調用的執行模塊. 幾乎沒有任何緣由直接使用這個模塊, 請使用 os 模塊替代.
(只用於 Windows , 2.0 中新增) _winreg 模塊提供了訪問 Windows 註冊表數據庫的一個基本接口.
(非直接使用模塊, 只用於 Unix/POSIX ) posix 模塊是 os 模塊在 Unix 及其餘 POSIX 系統下使用的實現模塊. 通常只須要經過 os 模塊訪問它便可.
就是其餘模塊中用到的模塊.
dospath 模塊提供了 DOS 平臺下的 os.path 功能. 你可使用它在其餘平臺處理 DOS 路徑.
注意 Python 的 DOS 支持可使用斜槓和反斜槓做爲目錄分隔符.
macpath 模塊提供了 Macintosh 平臺下的 os.path 功能. 你也可使用它在其餘平臺處理 Macintosh 路徑.
ntpath 模塊提供了 Windows 平臺下的 os.path 功能. 你也可使用它在其餘平臺處理 Windows 路徑.
注意該模塊能夠同時使用斜槓和反斜槓做爲目錄分隔符.
posixpath 模塊提供了 Unix 和其餘 POSIX 兼容平臺下的 os.path 功能. 你也可使用它在其餘平臺處理 POSIX 路徑. 另外, 它也能夠處理 URL .
(已廢棄) strop 爲 string 模塊中的大多函數提供了底層 C 語言實現. string 模塊會自動調用它, 因此通常你不須要直接使用它.
不過在導入 Python 模塊以前處理路徑的時候你可能會用到它. 在 Python 2.0 及之後版本中, 你應該使用字符串方法代替 strop , 例如在上邊的代碼中. 使用 "sys.executable.lower()" 替換 "strop.lower(sys.executable)" .
imp 模塊包含的函數能夠用於實現自定義的 import 行爲. 注意這裏的導入功能不支持包. 具體實現請參閱 knee 模塊的源代碼.
new 模塊是一個底層的模塊, 你可使用它來建立不一樣的內建對象, 例如類對象, 函數對象, 以及其餘由 Python 運行時系統建立的類型. 若是你使用的是 1.5.2 版本 , 那麼你有可能須要從新編譯 Python 來使用這個模塊, 在默認狀況下並非全部平臺都有這個模塊. 在 2.0 及之後版本中, 不須要這麼作.
(已廢棄) pre 模塊是 1.5.2 中 re 模塊調用的實現功能模塊. 在當前版本中已廢棄.
(功能實現模塊, 已聲明不支持) sre 模塊是 re 模塊的底層實現. 通常不必直接使用它, 並且之後版本將不會支持它.
py_compile 模塊用於將 Python 模塊編譯爲字節代碼. 它和 Python 的 import 語句行爲相似, 不過它接受文件名而不是模塊名做爲參數. compileall 模塊能夠把一個目錄樹下的全部 Python 文件編譯爲字節代碼.
compileall 模塊用於將給定目錄下(以及 Python path )的全部 Python 腳本編譯爲字節代碼. 它也能夠做爲可執行腳本使用(在 Unix 系統下, Python 安裝時會自動調用執行它).
ihooks 模塊爲替換導入提供了一個框架. 這容許多個導入機制共存.
linecache 模塊用於從模塊源文件中讀取代碼. 它會緩存最近訪問的模塊 (整個源文件).
traceback 模塊使用這個模塊實現了對導入操做的跟蹤.
(功能實現模塊) macurl2path 模塊用於 URL 和 Macintosh 文件名 的相互映射. 通常沒有必要直接使用它, 請使用 urllib 中的機制.
(功能實現模塊) nturl2path 模塊用於 URL 和 Windows 文件名的 相互映射.
tokenize 模塊將一段 Python 源文件分割成不一樣的 token . 你能夠在代碼高亮工具中使用它.
注意這裏的 tokenize 函數接受兩個可調用對象做爲參數: 前一個用於獲取新的代碼行, 第二個用於在得到每一個 token 時調用.
keyword 模塊有一個包含當前 Python 版本所使用的關鍵字的列表. 它還提供了一個字典, 以關鍵字做爲 key , 以一個描述性函數做爲 value , 它可用於檢查 給定單詞是不是 Python 關鍵字.
(可選) parser 模塊提供了一個到 Python 內建語法分析器和編譯器的接口.
symbol 模塊包含 Python 語法中的非終止符號. 可能只有你涉及 parser 模塊的時候用到它.
token 模塊包含標準 Python tokenizer 所使用的 token 標記.
本章描述的是一些並不怎麼常見的模塊. 一些是很實用的, 另些是已經廢棄的模塊.
pyclbr 模塊包含一個基本的 Python 類解析器.
版本 1.5.2 中, 改模塊只包含一個 readmodule 函數, 解析給定模塊, 返回一個模塊全部頂層類組成的列表.
訪問類實例的屬性能夠得到關於類的更多信息, .
( 2.0 新增) filecmp 模塊用於比較文件和目錄,
1.5.2 以及先前版本中, 你可使用 cmp 和 dircmp 模塊代替.
cmd 模塊爲命令行接口( command-line interfaces , CLI )提供了一個簡單的框架. 它被用在 pdb 模塊中, 固然你也能夠在本身的程序中使用它,
你只須要繼承 Cmd 類, 定義 do 和 help 方法. 基類會自動地將這些方法轉換爲對應命令.
Feather 注: 版本 2.3 時取消了改模塊的支持, 具體緣由請參閱 : http://www.amk.ca/python/howto/rexec/ 和 http://mail.python.org/pipermail/python-dev/2002-December/031160.html
解決方法請參閱: http://mail.python.org/pipermail/python-list/2003-November/234581.html
rexec 模塊提供了在限制環境下的 exec , eval , 以及 import 語句, 在這個環境下, 全部可能對機器形成威脅的函數都不可用.
Feather 注: 版本 2.3 時取消了改模塊的支持, 具體緣由請參閱 : http://www.amk.ca/python/howto/rexec/ 和 http://mail.python.org/pipermail/python-dev/2003-January/031848.html
Bastion 模塊, 容許你控制給定對象如何使用, 你能夠經過它把對象從未限制部分傳遞到限制部分.
默認狀況下, 全部的實例變量都是隱藏的, 全部的方法如下劃線開頭.
(可選) readline 模塊使用 GNU readline 庫(或兼容庫)實現了 Unix 下加強的輸入編輯支持.
該模塊提供了加強的命令行編輯功能, 例如命令行歷史等. 它還加強了 input 和 raw_input 函數.
(可選, 只用於 Unix ) rlcompleter 模塊爲 readline 模塊提供了單詞自動完成功能.
導入該模塊就能夠啓動自動完成功能. 默認狀況下完成函數被綁定在了 Esc 鍵上. 按兩次 Esc 鍵就能夠自動完成當前單詞. 你可使用下面的代碼修改所綁定的鍵:
import readline readline.parse_and_bind("tab: complete")
statvfs 模塊包含一些與 os.statvfs (可選)函數配合使用的常量和函數, 該函數會返回文件系統的相關信息.
calendar 模塊是 Unix cal 命令的 Python 實現. 它能夠將給定年份/月份的日曆輸出到標準輸出設備上.
prmonth(year, month) 打印給定月份的日曆,
sched 模塊爲非線程環境提供了一個簡單的計劃任務模式.
statcache 模塊提供了訪問文件相關信息的相關函數. 它是 os.stat 的擴展模塊, 並且它會緩存收集到的信息.
2.2 後該模塊被廢棄, 請使用 os.stat() 函數代替, 緣由很簡單, 它致使了更復雜的緩存管理, 反而下降了性能.
grep 模塊提供了在文本文件中搜索字符串的另種方法, 版本 2.1 時被聲明不支持, 及就是說, 當前版本已經沒法使用該模塊.
(已經廢棄) 與 statcache 相似, 該模塊是 os.listdir 函數的一個擴展, 提供了緩存支持, 可能由於一樣的緣由被廢棄吧~ MUHAHAHAHAHA~~~~ . 請使用 os.listdir 代替.
(已廢棄, 只用於 1.5.2) dircmp 模塊用於比較兩個目錄的內容, Python 2.0 後, 該模塊被 filecmp 替換.
(已廢棄, 只用於 1.5.2) cmp 模塊用於比較兩個文件,.
Python 2.0 後, 該模塊被 filecmp 替換.
(已廢棄, 只用於 1.5.2) cmpcache 模塊用於比較兩個文件. 它是 cmp 模塊的擴展, 提供了緩存支持.
Python 2.0 後, 該模塊被 filecmp 替換.
但 filecmp 已經不提供緩存支持.
(已廢棄, 只用於 1.5.2) util 模塊提供了常見操做的封裝函數. 新代碼可使用如 Examples 14-21 到 14-23 的實現方法.
(已廢棄, 只用於 1.5.2) soundex 實現了一個簡單的 hash 算法, 基於英文發音將單詞轉換爲 6 個字符的字符串.
版本 2.0 後, 該模塊已從標準庫中刪除.
get_soundex(word) 返回給定單詞的 soundex 字符串. sound_similar(word1, word2) 判斷兩個單詞的 soundex 是否相同. 通常說來發音類似的單詞有相同的 soundex .
(已廢棄, 只用於 Unix ) timing 用於監控 Python 程序的執行時間. time.clock() 能夠替換 time.time() 得到 CPU 時間.
(已廢棄, 只用於 Unix ) posixfile 提供了一個類文件的對象( file-like object ), 實現了文件鎖定的支持. 新程序請使用 fcntl 模塊代替.
bisect 模塊用於向排序後的序列插入對象.
insort(sequence, item) 將條目插入到序列中, 而且保證序列的排序. 序列能夠是任意實現了 _ _getitem_ _ 和 insert 方法的序列對象.
bisect(sequence, item) => index 返回條目插入後的索引值, 不對序列作任何修改.
knee 模塊用於 Python 1.5 中導入包( package import )的實現. 固然 Python 解釋器已經支持了這個, 因此這個模塊幾乎沒有什麼做用, 不過你能夠看看它的代碼, 明白這一切是怎麼完成的.
代碼請參見 Python-X.tgz/Python-2.4.4/Demo/imputil/knee.py
固然, 你能夠導入該模塊,
(已廢棄) tzparse 模塊用於解析時區標誌( time zone specification ). 導入時它會自動分析 TZ 環境變量.
除了這些變量以外, 該模塊還提供了一些用於時間計算的函數.
(已廢棄) regex 模塊是舊版本的(1.5 前)正則表達式模塊,新代碼請使用 re 模塊實現.
注意在 Python 1.5.2 中 regex 比 re 模塊要快. 但在新版本中 re 模塊更快.
(已廢棄) regsub 模塊提供了基於正則表達式的字符串替換操做. 新代碼請使用 re 模塊中的 replace 函數代替.
(已廢棄) reconvert 提供了舊樣式正則表達式( regex 模塊中使用)到新樣式( re 模塊)的轉換工具. 它也能夠做爲一個命令行工具.
(已廢棄) regex_syntax 模塊用於改變正則表達式的模式.
(已廢棄, 只用於 1.5.2) find 模塊用於在給定目錄及其子目錄中查找符合給定匹配模式的文件
匹配模式的語法與 fnmatch 中相同.