下面列出的各類 Python 庫/模塊/工具,若是名稱帶超連接,說明是第三方的;不然是 Python 語言內置的。html
正則表達式的標準庫。前端
以讀寫文件的方式來操做字符串(有點相似於內存文件)。python
cStringIO 是 C 語言實現的,提供高性能;而 StringIO 是 Python 實現的,提供 Unicode 兼容性。mysql
chardet 能夠猜想任意一段文本的字符集編碼。對於編碼類型未知的文本,它會頗有用。react
chardet 既能夠做爲模塊來使用,也能夠做爲命令行工具來使用。ios
代碼示例git
import chardet
print chardet.detect(bytes)
這個標準庫顧名思義,封裝了經常使用的數學函數(開方、指數、對數、三角函數、等)github
這個標準庫顧名思義,是用來進行隨機數生成的web
代碼示例正則表達式
# 生成 0-100 的隨機數
import random
random.seed()
random.randint(0, 100)
這個標準庫封裝了跟有理數(分數)相關的運算
在 Python 2.5 版本加入到標準庫中。經過它,你能夠很方便地計算各類散列值。
它支持的哈希算法有:MD5 SHA1 SHA224 SHA256 SHA384 SHA512
關於散列算法,俺寫過一篇掃盲(在這裏)。
代碼示例
# 計算字符串的 SHA1 散列值
import hashlib
sha1 = hashlib.sha1('Hello world').hexdigest()
這個庫包含了常見的對稱加密算法(DES、AES、IDEA、等)、公鑰加密算法(RSA、DSA、等)、散列算法(MD五、SHA一、RIPEMD、等)。
OpenSSL 在加密領域但是大名鼎鼎。這個庫使用 Python 對 OpenSSL 進行很薄的封裝。
Python 能夠很容易地跟其它編程語言整合。整合以後,就能夠在 Python 代碼中使用其它編程語言的函數、模塊、庫,很是爽!
ctypes 在 Python 2.5 版本加入到標準庫中。
經過它,你能夠很方便地調用 C/C++ 動態庫導出的函數,能夠在 Python 中使用各類 C/C++ 的數據類型(好比指針)。
代碼示例
# 調用 Linux/Unix 系統的標準 C 函數,獲取當前時間
from ctypes import *
libc = CDLL('libc.so.6')
time = libc.time(None)
# 調用 Windows 系統 API,彈出消息提示框
from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT
prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = (1, 'hwnd', 0), (1, 'text', 'Hi'), (1, 'caption', None), (1, 'flags', 0)
MessageBox = prototype(('MessageBoxA', windll.user32), paramflags)
MessageBox(text='Hello world',flags=2)
這是一個很老牌的、有名氣的工具,它能夠把多種語言(Java、Python、C#、Ruby、PHP、Perl、Lua、Go、等)整合到 C/C++ 中。
這個工具可讓你用 Python 的語法寫擴展模塊的代碼,而後它幫你把 Python 代碼編譯爲本地動態庫(機器碼)。
用它編譯出來的擴展模塊,其性能跟 C/C++ 編寫的擴展模塊至關。
經過 Jython 可讓 Python 代碼運行在 JVM 上,而且能夠調用其它的 JVM 語言的代碼(好比 Java Scale)
經過 IronPython 可讓 Python 代碼運行在 dotNET 平臺上,而且能夠調用其它的 dotNET 語言的代碼(好比 C# F#)
這是用 Python 封裝 Mac OS X 上的 Objective-C 庫。
這是一個很是基本的標準庫,提供了常見的操做系統相關操做。
相對於 os 標準庫,shutil 標準庫提供了一些比較高級的文件和目錄操做(目錄遞歸複製、目錄遞歸刪除、目錄壓縮打包、等)
代碼示例
# 遞歸刪除某個目錄
import shutil
shutil.rmtree(xxxx)
這個標準庫用於查找文件(支持通配符)
代碼示例
# 獲取當前目錄全部 txt 文件
import glob
files = glob.glob('./*.txt')
這個標準庫用於匹配文件名(支持通配符)
代碼示例
# 列出當前目錄全部 txt 文件
import os, fnmatch
for file in os.listdir('.') :
if fnmatch.fnmatch(file, '*.txt') :
print(file)
使用這個標準庫,能夠安全地生成臨時文件或臨時目錄。
用於進程管理的標準庫,能夠啓動子進程,經過標準輸入輸出跟子進程交互。
其中 multiprocessing 是 2.6 版本加入到標準庫的。
用於進程信號處理的標準庫。
提供了內存映射文件的支持。
代碼示例
# 利用 mmap 在父子進程間交換數據
import os
import mmap
map = mmap.mmap(-1, 13)
map.write("Hello world")
pid = os.fork()
if pid == 0: # 子進程
map.seek(0)
print map.readline()
map.close()
這個第三方庫封裝了 Windows API 及 COM API。經過它能夠方便地用 Python 進行 Windows 編程(調用 COM 組件、編寫 Windows 服務、等)。
經過這個標準庫,能夠很方便地跟 POSIX 的 syslog 服務進行交互。
PyInstaller 能夠把你的 Python 代碼製做成獨立運行的程序(不依賴 Python 環境就能夠運行)。
該工具支持多種操做系統,包括:Windows、Linux、Mac OS X、Solaris、AIX、等。
py2exe 的功能相似 PyInstaller,但只支持 Windows 平臺。
它很相似於 py2exe,差異在於 py2exe 支持 Windows 平臺,而 py2app 支持 Mac OS X 平臺。
這套工具能夠幫助你進行第三方庫的管理(下載、編譯、安裝、升級、卸載)
現在 Web 開發很火,俺把 Web 相關的單獨分一類。
這幾個庫能夠進行各類 HTTP 客戶端請求(GET、POST、等)。
Python2 的模塊名叫 httplib / httplib2,到 Python3 模塊名改成 http.request / urllib.parse
代碼示例
# 讀取指定 URL 的網頁內容
import urllib
handle = urllib.urlopen('http://www.google.com')
page = handle.read()
handle.close()
提供輕量級 HTTP Server 的標準庫。
Python2 的模塊名叫 SimpleHTTPServer,到 Python3 模塊名改成 http.server
代碼示例
#一個極簡單的 HTTP 服務
import SocketServer
import SimpleHTTPServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(('', PORT), Handler)
print 'serving at port', PORT
httpd.serve_forever()
在 Python 社區,Django 是目前最有影響力的 Web 開發框架。該框架很重型,內置了 Web 服務端開發經常使用的組件。
Django 應用範圍很廣,好比 Google 的 Web 開發平臺 GAE 就支持它。
Django 徹底支持前面提到的 Jython 運行環境,能夠運行在任何 J2EE 服務器上。
又一個重型的 Web 開發框架,名氣僅次於 Django。
這是 FriendFeed 開發的 Web 框架。FriendFeed 被 Facebook 收購以後,該框架被開源。
這是一個很輕量級的 Web 框架,可是擴展性很好。
代碼示例
# 用 Flask 寫 Hello world
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
這是從 GWT(Google Web Toolkit)移植的第三方庫。提供了 Python 到 JS 的編譯,AJAX 框架等功能。 Pyjamas 甚至能用來開發桌面 GUI 應用。
這也是一個 Python 到 JavaScript 的編譯工具。
操縱當前系統的默認瀏覽器,訪問指定 URL 的頁面。
代碼示例
# 用默認瀏覽器打開 Google 主頁
import webbrowser
webbrowser.open('http://www.google.com')
v8 是 Google 開發的 JavaScript 解釋引擎。這是對 v8 引擎的 Python 封裝。
代碼示例
import PyV8
ctxt1 = PyV8.JSContext()
ctxt1.enter()
ctxt1.eval('1+2') # 對 JS 表達式求值
class Global(PyV8.JSClass) : # 定義一個兼容 JS 的類
def hello(self) :
print 'Hello world'
ctxt2 = PyV8.JSContext(Global()) # 建立一個 JS 上下文,傳入 Global 類的對象
ctxt2.enter()
ctxt2.eval('hello()') # 調用 hello() 函數
WebKitGtk 是一個基於 WebKit 的 Web 渲染引擎。這是 WebKitGtk 的 Python 封裝。
這是一個底層的網絡庫,能夠在不一樣協議層次構造網絡數據包(包括鏈路層、網絡層、傳輸層),還支持 Sniffer 抓包。
搞網絡安全的網友應該會喜歡這個庫。
代碼示例
# 傳統的 ping 掃描(網絡層)
ans,unans = sr(IP(dst='192.168.1.1-254')/ICMP())
# 局域網內的 ARP 掃描(鏈路層)
ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=2)
Python 標準庫很早就提供了對 socket 編程的支持。
這個標準庫是對伯克利套接字進行簡單的封裝,其 API 基本上跟 BSD SOCKET 一一對應。
這個標準庫提供了異步 SOCKET 的支持。
這個標準庫基於上述的 asyncore,提供更高層的 API,簡化異步通信編程。
封裝 FTP 協議(文件傳輸)的標準庫
封裝 SMTP 協議(郵件發送)的標準庫
封裝 IMAP 協議(郵件接收)的標準庫
封裝 POP3 協議(郵件接收)的標準庫
cURL 是一個功能很強的網絡庫/網絡工具,支持 N 多應用層協議。這是用 Python 封裝的第三方庫。
關於 cURL,俺前幾年寫過一篇博文推薦它(在這裏)。
Jabber(又稱 XMPP)是IM(即時通訊)協議的標準。這是用 Python 封裝的第三方庫。
IRC 是 Internet Relay Chat 的縮寫。這是用 Python 封裝的第三方庫。
標準庫,提供 JSON 格式的編碼和解碼。
JSON 格式現在在 Web 開發中廣爲應用。
代碼示例
import json
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# JSON 編碼
# 獲得以下字符串
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
# JSON 解碼
# 獲得以下對象
# [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
標準庫,提供 Base1六、Base3二、Base64 格式的編碼和解碼。
標準庫,提供 binhex4 格式的編碼和解碼。
標準庫,提供 uuencode 格式的編碼和解碼。
這是 Google 開發的一個跨語言的庫,用於網絡傳輸的編碼和解碼。
它的優勢是:跨多種語言、高性能、向前兼容、向後兼容。俺前幾年寫過一篇博文推薦 protobuf(在這裏)。
這是一個基於 Python 網絡通信開發框架,有十多年曆史,名氣很大。
它的某些設計相似於 C++ 的 ACE 框架。除了能用來進行傳輸層(TCP UDP)的開發,還提供了若干應用層協議(HTTP、XMPP、SSH、IRC、等)的支持。
代碼示例
# 實現一個簡單的 Echo 服務,監聽在 12345 端口
from twisted.internet import protocol, reactor
class Echo(protocol.Protocol) :
def dataReceived(self, data) :
self.transport.write(data)
class EchoFactory(protocol.Factory) :
def buildProtocol(self, addr) :
return Echo()
reactor.listenTCP(12345, EchoFactory())
reactor.run()
爲了便於數據庫開發,Python 社區制定了數據庫的 API 規範(PEP 249)。
只要是涉及到數據庫操做,標準庫和大部分第三方庫都會遵循該規範。請看以下幾個模塊的示例代碼。
pyODBC 封裝了 ODBC API,經過它能夠訪問各類數據庫(只要有 ODBC 驅動便可)。
代碼示例
# 查詢某個 ODBC 數據源的某個表
import pyodbc
conn = pyodbc.connect('DSN=xxx;PWD=password')
cursor = conn.cursor()
cursor.execute('SELECT field1 FROM table1')
while True :
row = cursor.fetchone()
if not row :
break
print(row)
cursor.close()
conn.close()
又一個封裝 ODBC API 的第三方庫
Jython 前面提到過。它能夠基於 JDBC 操做數據庫。
PyWin32 前面提到過。它能夠基於 ADO 操做數據庫。
IronPython 前面提到過。它能夠基於 ADO.NET 操做數據庫。
操做 MySQL 的第三方庫。
代碼示例
# 查詢某個 MySQL 數據庫的某個表
import MySQLdb
conn = MySQLdb.connect(db='test', passwd='password')
cursor = conn.cursor()
cursor.execute('SELECT field1 FROM table1')
while True :
row = cursor.fetchone()
if not row :
break
print(row)
cursor.close()
conn.close()
操做 PostgreSQL 的第三方庫。
操做 PostgreSQL 的第三方庫。
操做 Oracle 的第三方庫。
操做微軟 SQL Server 的第三方庫。
操做 DB2 的第三方庫。
sqlite3 從 Python 2.5 版本開始加入到標準庫中。經過它,你能夠很方便地操做 SQLite 數據庫。
SQLite 是一個很優秀的輕量級數據庫,俺前幾年寫過一篇博文推薦它(在這裏)。
代碼示例
# 建立一個內存數據庫,建表並插入記錄
import sqlite3
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()
cursor.execute('CREATE TABLE person (name text, age int)')
cursor.execute('''INSERT INTO stocks VALUES ('TOM',20)''')
conn.commit()
conn.close()
操做 Berkeley DB 的第三方庫。
SQLAlchemy 支持的數據庫有:MySQL、PostgreSQL、Sqlite、Oracle、MS SQL Server、Firebird、Sybase SQL Server、Informix、等。
代碼示例
# 經過對象的方式建立兩張依賴關係的表
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker
Base = declarative_base()
class Movie(Base) :
__tablename__ = 'movies'
id = Column(Integer, primary_key=True)
title = Column(String(255), nullable=False)
year = Column(Integer)
directed_by = Column(Integer, ForeignKey('directors.id'))
director = relation('Director', backref='movies', lazy=False)
def __init__(self, title=None, year=None) :
self.title = title
self.year = year
def __repr__(self) :
return 'Movie(%r, %r, %r)' % (self.title, self.year, self.director)
class Director(Base) :
__tablename__ = 'directors'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True)
def __init__(self, name=None) :
self.name = name
def __repr__(self) :
return 'Director(%r)' % (self.name)
Base.metadata.create_all(create_engine('dbms://user:pwd@host/dbname'))
SQLObject 支持的數據庫有:MySQL、PostgreSQL、Sqlite、MS SQL Server、Firebird、Sybase SQL Server、SAP DB、等。
代碼示例
# 經過對象的方式建立表
from sqlobject import *
sqlhub.processConnection = connectionForURI('sqlite:/:memory:')
class Person(SQLObject) :
first_name = StringCol()
last_name = StringCol()
Person.createTable()
Tk 是一個跨平臺的界面組件庫。
這是 Python 內置的標準庫,封裝了 Tcl/Tk 界面庫。
Python2 的模塊名叫 Tkinter,到 Python3 模塊名改成 tkinter
代碼示例
# 用 Tkinter 寫 Hello world
from Tkinter import *
if __name__ == '__main__' :
root = Tk()
label = Label(root, text='Hello world')
label.pack()
root.mainloop()
wxWidgets 是 C++ 開發的跨平臺框架(不只包括 GUI,還有其它功能)。
在全部的 wxWidgets 的 Python 封裝庫中,這個是名氣最大的。
Ulipad(知名的國產的 Python IDE)就是基於 wxPython 開發的。
代碼示例
# 用 wxPython 寫 Hello world
import wx
class Frame(wx.Frame) :
pass
class App(wx.App) :
def OnInit(self) :
self.frame = Frame(parent=None, title='Hello world')
self.frame.Show()
self.SetTopWindow(self.frame)
return True
if __name__ == '__main__' :
app = App()
app.MainLoop()
又一個基於 wxWidgets 的 GUI 庫。
GTK+ 全稱是(GIMP Toolkit),由 C 開發的跨平臺界面組件庫。
這是 Python 對 GTK 的封裝。
代碼示例
# 用 PyGTK 寫 Hello world
import pygtk
pygtk.require('2.0')
import gtk
class HelloWorld :
def __init__(self) :
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect('delete_event', self.delete_event)
self.window.connect('destroy', self.destroy)
self.window.set_border_width(10)
self.button = gtk.Button('Hello world')
self.button.connect('clicked', self.hello, None)
self.button.connect_object('clicked', gtk.Widget.destroy, self.window)
self.window.add(self.button)
self.button.show()
self.window.show()
def main(self) :
gtk.main()
def hello(self, widget, data=None) :
print 'Hello world'
def delete_event(self, widget, event, data=None) :
print 'delete event occurred'
return False
def destroy(self, widget, data=None) :
gtk.main_quit()
if __name__ == '__main__' :
hello = HelloWorld()
hello.main()
Qt 是 C++ 開發的跨平臺框架(不只包括 GUI,還有其它功能)。
這是 Python 對 Qt 的封裝。
代碼示例
# 用 pyQt 寫 Hello world
import sys
from PyQt4.QtGui import *
if __name__ == '__main__' :
app = QApplication(sys.argv)
window = QWidget()
window.resize(320, 240)
window.setWindowTitle('Hello world')
window.show()
sys.exit(app.exec_())
這也是 Python 對 Qt 的封裝。
FLTK 全稱是( Fast Light Tool Kit),由 C++ 開發的跨平臺、輕量級界面組件庫。
這是 Python 對 FLTK 的封裝。
PyWin32 前面提到過。它能夠提供原生的 Windows GUI 界面。
IronPython 前面提到過。它能夠提供 dotNET 的 GUI 界面。
Jython 前面提到過。它能夠提供基於 Java 的 Swing 界面。
EasyGUI 這是一個很輕量級的庫。跟其它 GUI 不一樣之處在於——沒有事件驅動。
PyGUI 是一個更高層的 GUI 庫,底層分別封裝了 PyWin32(Windows 平臺)、PyGTK(Linux 平臺)、PyObjC(Mac OS X 平臺)。
跨平臺的多媒體框架和界面庫,用來開發比較炫的界面。
除了支持桌面操做系統,還支持 Android / iOS,支持多點觸摸。
基於 PyGame 的一個跨平臺 GUI 庫。PyGame 下面會提到。
這是一個有名的圖形庫,主要用來繪製數學相關的圖形。
跟後面提到的 SciPy 整合能夠起到相似 MATLAB 的效果。效果圖在「這裏」。
這是 Python 對 gnuplot 的封裝。gnuplot 的效果圖在「這裏」。
這是一個純 Python 的庫,依賴於 PyQt4 / PySide。效果圖在「這裏」。
這個庫能夠跟 TeX / LaTeX 無縫整合,支持導出爲 PostScript / PDF 格式。適合用來製做報表。效果圖在「這裏」。
這是一個商業公司維護的庫,主要提供2維圖表。效果圖在「這裏」。
處理 zip 格式的標準庫。
處理 bzip2 格式的標準庫。
處理 gzip 格式的標準庫。
處理 gzip 格式的標準庫。
處理 tar 格式的標準庫。
處理 7zip 格式的第三方庫。
處理 rar 格式的第三方庫。
處理 msi 格式的標準庫,從 Python 2.5 版本開始提供。
用 DOM(Document Object Model)方式處理 XML 文件的標準庫。
用 SAX(Simple API for XML)方式處理 XML 文件的標準庫。
著名的 C 語言庫 libxml 和 libxslt 的 Python 封裝。
功能很強,支持 XPath 1.0、XSLT 1.0、擴展 EXSLT、等。還能夠用來解析 HTML 格式。
以回調方式解析 HTML/XHTML 文件內容的標準庫。
這是一個頗有名氣的 Python 圖像處理庫,支持常見圖像文件格式(BMP、JPG、GIF、PNG、等),能夠對圖像進行各類常見操做(格式轉換、旋轉、縮放、剪切、等)。
代碼示例
# 旋轉某圖片並顯示
from PIL import Image
im = Image.open('xxx.jpg')
im = im.rotate(90)
im.show()
這是 FPDF 的 Python 移植庫,用來生成 PDF 文檔。
支持的功能比較全(嵌入字體、嵌入圖片),文檔也比較詳細。
代碼示例
# 這是個簡單 Hello World 示例
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font('Arial', 'B', 16)
pdf.cell(40, 10, 'Hello World')
pdf.output('test.pdf', 'F')
# 支持寫入 HTML 語法。目前支持幾種常見的 HTML tag
from pyfpdf import FPDF, HTMLMixin
class MyFPDF(FPDF, HTMLMixin) :
pass
pdf = MyFPDF()
pdf.add_page()
pdf.write_html(html)
pdf.output('test.pdf', 'F')
pyPdf 目前已經不繼續升級維護了。PyPDF2 是 pyPdf 的 fork 並繼續增長新功能。
除了能夠提取文件屬性,還能夠切分/合併文檔,加密/解密文檔。
能夠提取 PDF 文件屬性以及每頁的文本,支持把內容輸出爲 HTML 格式。
PyWin32 前面提到過。它能夠基於 COM 操做 Office 文檔,包括 Word(本地須要安裝 Office)。
該庫能夠支持 Office Excel(97/2000/XP/2003)以及 OpenOffice Calc 的文檔。無需依賴外部軟件。
PyWin32 前面提到過。它能夠基於 COM 操做 Office 文檔,包括 Excel(本地須要安裝 Office)。
該庫能夠用來生成 pptx(Open XML PowerPoint)格式的文檔。
PyWin32 前面提到過。它能夠基於 COM 操做 Office 文檔,包括 Excel(本地須要安裝 Office)。
這是基於 chmlib 的 Python 封裝庫。能夠提取 CHM 文件的屬性以及每一個頁面的內容。
這個 Python 庫能夠用來處理 RTF(富文本格式)文檔。
跨平臺的 Python 第三方庫,用來輔助遊戲開發的,名氣很是大。
封裝 OpenGL 的 Python 第三方庫。
封裝 OGRE(3D 渲染引擎)的 Python 第三方庫。
NumPy 提供了功能強大、性能很高的數值數組,能夠用來進行各類數值計算(包括矩陣運算)。
代碼示例
# 如下是傳統 Python 寫法,冗長且速度較慢
a = range(10000000)
b = range(10000000)
c = []
for i in range(len(a)) :
c.append(a[i] + b[i])
# 如下是 NumPy 的寫法,簡潔且速度飛快
import numpy as np
a = np.arange(10000000)
b = np.arange(10000000)
c = a + b
SciPy 依賴 NumPy 提供的多維數組。相比 NumPy,SciPy 提供了更高層的數學運算模塊(統計、線性代數、積分、常微分方程求解、傅立葉變換、信號處理、等),被普遍用於科研和工程領域。
一些不方便歸類的,暫時放到這裏。
這是一個用 Python 寫的 Python 解釋器(有點繞口令)。
PyPy 支持 JIT(Just-in-time compilation)和沙箱技術,可作到比 CPython 更快的運行速度。