【標準庫】html
提供基於正則的匹配和替換。前端
Home:https://github.com/erikrose/chardetnode
chardet 能夠猜想任意一段文本的字符集編碼。對於編碼類型未知的文本,它會頗有用。python
chardet 既能夠做爲模塊來使用,也能夠做爲命令行工具來使用。mysql
代碼示例react
import chardet
print(chardet.detect(bytes))
【標準庫】ios
以讀寫文件的方式來操做字符串(有點相似於內存文件)。git
cStringIO 是 C 語言實現的,性能更高;而 StringIO 是 Python 實現的,提供 Unicode 兼容性。程序員
【標準庫】github
能夠對兩個字符串進行「按行」比較,其功能相似於命令行的 diff。
另外還支持「最佳匹配」功能——對給定的字符串 s 和字符串列表 l,在 l 裏面找到最接近 s 的字符串。
Base64 是一組編碼算法的總稱。用於把二進制數據編碼爲文本。
【標準庫】
提供 Base1六、Base3二、Base64 格式的編碼和解碼。
UUencode 出現於早期的 Unix 系統。用於把二進制編碼爲文本,以便經過郵件系統發送。
【標準庫】
提供 UUencode 格式的編碼和解碼。
BinHex 起先用於 Mac OS 系統,相似於 UUencode。
【標準庫】
提供 BinHex 格式的編碼和解碼。
【標準庫】
顧名思義,這個標準庫封裝了經常使用的數學函數(開方、指數、對數、三角函數......)。
【標準庫】
顧名思義,這個標準庫是用來進行隨機數生成滴。
代碼示例——生成 0-100 的隨機數
import random
random.seed()
random.randint(0, 100)
【標準庫】
封裝了跟有理數(分數)相關的運算
Home:https://github.com/google/pytrie
這是 Google 實現的 trie(前綴樹/字典樹)封裝庫。
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)
Home:http://swig.org/
Links:Wikipedia
這是一個很老牌的、有名氣的工具,它能夠把多種語言(Java、Python、C#、Ruby、PHP、Perl、Lua、Go ...)整合到 C/C++ 中。
Home:http://cython.org/
這個工具可讓你用 Python 的語法寫擴展模塊的代碼,而後它幫你把 Python 代碼編譯爲本地動態庫(機器碼)。
用它編譯出來的擴展模塊,其性能跟 C/C++ 編寫的擴展模塊至關。
經過 Jython 可讓 Python 代碼運行在 JVM 上,而且能夠調用其它的 JVM 語言的代碼(好比 Java、Scala)
經過 IronPython 可讓 Python 代碼運行在 dotNET 平臺上,而且能夠調用其它的 dotNET 語言的代碼(C#、F#、http://VB.Net ...)
Home:https://github.com/go-python/gopy
gopy 能夠把 Go 源代碼編譯爲 Python 的一個 module。
它提供了兩種方式(命令行、Python 庫)來實現:Go 源碼編譯爲 Python 模塊。
Home:http://pyobjc.sourceforge.net/
這是用 Python 封裝 Mac OS X 上的 Objective-C 庫。
【標準庫】
這是很是基本的標準庫,提供了常見的操做系統相關功能,不少功能是針對文件系統。
【標準庫】
相對於 os 而言,shutil 提供了一些比較高級的文件和目錄操做(目錄遞歸複製、目錄遞歸刪除、目錄壓縮打包...)
代碼示例——遞歸刪除某個目錄
import shutil
shutil.rmtree(xxxx)
【標準庫】
用於查找文件,【支持通配符】(* 和 ?)
代碼示例——獲取當前目錄全部 txt 文件
import glob
for file in glob.glob("./*.txt") :
print(file)
【標準庫】
用於匹配文件名(支持通配符,相似上面的 glob)
代碼示例——列出當前目錄全部 txt 文件
import os, fnmatch
for file in os.listdir(".") :
if fnmatch.fnmatch(file, "*.txt") :
print(file)
【標準庫】
使用它能夠安全地生成臨時文件或臨時目錄。
【標準庫】
提供了比較高層的線程封裝 API。它自己包含了線程同步/互斥的機制。
代碼示例——基於「函數」的線程
import threading
import time
def my_thread() :
print("Thread started!")
time.sleep(3)
print("Thread finished!")
threading.Thread(target=my_thread).start()
代碼示例——基於「類」的線程
import threading
import time
from __future__ import print_function
class MyThread(threading.Thread) :
def run(self) :
print("{} started!".format(self.getName()))
time.sleep(3)
print("{} finished!".format(self.getName()))
if __name__ == "__main__" :
for n in range(10) :
mythread = MyThread(name = "Thread-{}".format(n + 1))
mythread.start()
time.sleep(1)
【標準庫】
用於進程管理,能夠啓動子進程,經過標準輸入輸出跟子進程交互。
代碼示例——啓動命令行進程,並獲取該進程的標準輸出
import subprocess
output = subprocess.check_output(["dir"]) # 獲取當前目錄的內容
output = subprocess.check_output(["netstat", "-an"]) # 獲取當前網絡連接
【標準庫】
它是 2.6 版本加入到標準庫的,其 API 接口的風格相似於 threading 模塊。
它自己包含了進程同步/互斥的機制。
代碼示例——利用其 Lock 機制,確保多個子進程的標準輸出不會混雜(每次只有一個進程調用 print)。
from multiprocessing import Process, Lock
def f(lock, n) :
lock.acquire()
print("hello world %d" % n)
lock.release()
if __name__ == "__main__" :
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
【標準庫】
提供了內存映射文件的支持。
代碼示例——利用 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()
【標準庫】
用於進程信號處理的標準庫(主要用於 Linux & UNIX 系統)。
【標準庫】
經過它能夠很方便地跟 POSIX 的 syslog 服務進行交互。
Home:http://python.net/crew/mhammond/win32/
這個第三方庫封裝了 Windows API 及 COM API。經過它能夠方便地用 Python 進行 Windows 編程(調用 COM 組件、編寫 Windows 服務、等)。
Home:http://www.pyinstaller.org/
PyInstaller 能夠把你的 Python 代碼製做成獨立運行的程序(不依賴 Python 環境就能夠運行)。
該工具支持多種操做系統,包括:Windows、Linux、Mac OS X、Solaris、AIX、等。
Links:Wikipedia
py2exe 的功能相似 PyInstaller,但只支持 Windows 平臺。
Home:https://bitbucket.org/ronaldoussoren/py2app
它很相似於 py2exe,差異在於 py2exe 支持 Windows 平臺,而 py2app 支持 Mac OS X 平臺。
Home:https://pypi.python.org/pypi/setuptools
這套工具能夠幫助你進行第三方庫的管理(下載、編譯、安裝、升級、卸載)
【標準庫】
這幾個庫能夠進行各類 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()
Home:http://www.python-requests.org/
這是一個用起來很優雅的庫,如其名,封裝了 HTTP 請求的功能。
代碼示例
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
【標準庫】
提供輕量級 HTTP Server 的標準庫。
Python2 的模塊名叫 SimpleHTTPServer;到 Python3 模塊名改成 http.server
代碼示例——一個極簡單的 HTTP 服務
import SocketServer
import SimpleHTTPServer
PORT = 8080
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print("serving at port %d" % PORT)
httpd.serve_forever()
(Python 的 Web 框架數不勝數,俺只挑選幾個表明性的)
Home:https://www.djangoproject.com/
在 Python 社區,Django 是目前最有影響力的 Web 開發框架。該框架很重型,內置了 Web 服務端開發經常使用的組件(好比:ORM、用戶管理)。
Django 應用範圍很廣,好比 Google 的 Web 開發平臺 GAE 就支持它。
並且它徹底支持前面提到的 Jython 運行環境,能夠運行在任何 J2EE 服務器上。
Home:http://www.turbogears.org/
又一個重型的 Web 開發框架,名氣僅次於 Django。
它跟 Django 同樣,都是「Full-Stack Frameworks」。
Links:Wikipedia
輕量級的 Web 框架。某些 Web 框架(好比前面提到的 TurboGears)使用它做爲底層。
代碼示例——Hello world
import cherrypy
class HelloWorld(object):
def index(self):
return "Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
Home:http://webpy.org/
與前兩個(Django、TurboGears)不一樣,這是一個輕量級的框架。甚至被稱爲「It's the anti-framework framework.」
其做者是大名鼎鼎的黑客 Aaron Swartz。(俺在某篇博文中悼念過他)。
當年 Aaron Swartz 用 web.py 來搭建一樣大名鼎鼎的網站 reddit(該網站是 Web 2.0 的標杆)。
代碼示例——Hello world
import web
urls = (
"/", "index"
)
class index:
def GET(self):
return "Hello, world!"
if __name__ == "__main__" :
app = web.application(urls, globals())
app.run()
Home:http://pyjs.org/
這是從 GWT(Google Web Toolkit)移植的第三方庫。提供了 Python 到 JS 的編譯,AJAX 框架等功能。
Pyjamas 甚至能用來開發桌面 GUI 應用。
Home:https://github.com/chrivers/pyjaco
這也是一個 Python 到 JavaScript 的編譯工具。
【標準庫】
操縱當前系統的默認瀏覽器,訪問指定 URL 的頁面。
代碼示例——用默認瀏覽器打開 Google 主頁
import webbrowser
webbrowser.open("http://www.google.com")
Home:https://pypi.python.org/pypi/PyV8
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() 函數
Home:https://github.com/jmalonzo/pywebkitgtk
WebKitGtk 是一個基於 WebKit 的 Web 渲染引擎。
PyWebKitGtk 則提供了對 WebKitGtk 的 Python 封裝。
Home:https://github.com/google/pywebsocket
這是 Google 提供的 WebSocket 服務端。
該項目包含一個可獨立運行的 server 以及一個 Apache 擴展模塊(mod_pywebsocket)。
Home:http://www.secdev.org/projects/scapy/
Links:Wikipedia
這是一個底層的網絡庫,能夠在不一樣協議層次構造網絡數據包(包括鏈路層、網絡層、傳輸層),還支持 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,簡化異步通信編程。
Home:http://pycurl.sourceforge.net/
cURL 是一個功能很強的網絡庫/網絡工具,支持 N 多應用層協議。俺在前幾年寫過一篇博文推薦它(在「這裏」)。
看名稱就能猜到——PycURL 是 cURL 的 Python 封裝。
代碼示例——發起 HTTP GET 請求
import pycurl
try :
from io import BytesIO
except ImportError :
from StringIO import StringIO as BytesIO
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, "http://pycurl.sourceforge.net/")
curl.setopt(curl.WRITEDATA, buffer)
curl.perform()
curl.close()
body = buffer.getvalue()
(關於「HTTP 協議」,請參見另外一個大類:「Web」)
【標準庫】
封裝 FTP(File Transfer Protocol)協議
代碼示例——列出 FTP 服務器上某目錄的內容
from ftplib import FTP
ftp = FTP("ftp.debian.org") # 鏈接服務器(若是不指定端口號,則用默認端口號 21)
ftp.login() # 登陸(若是不指定用戶名和密碼,則用匿名登陸)
ftp.cwd("debian") # 切換到 "debian" 目錄
ftp.retrlines("LIST") # 列出當前目錄的內容
ftp.quit()
Home:https://bitbucket.org/dundeemt/pysftp
封裝 SFTP 協議,依賴於 ssh.py
代碼示例——簡單的上傳/下載
import pysftp
with pysftp.Connection("hostxxx", username="userxxx", password="xxxxxx") as sftp :
with sftp.cd("public") # 服務端當前目錄切換到 public
sftp.put("/my/local/filename") # 上傳某個本地文件到服務端的 public 目錄
sftp.get_r("myfiles", "/local") # 遞歸複製某個服務端的目錄到本地
【標準庫】
封裝 SMTP(Simple Mail Transfer Protocol)協議
【標準庫】
封裝 IMAP(Internet Message Access Protocol)協議
【標準庫】
封裝 POP3(Post Office Protocol v3)協議
Home:http://jabberpy.sourceforge.net/
Jabber(又稱 XMPP)是IM(即時通訊)協議的標準。這是用 Python 封裝的第三方庫。
Home:https://bitbucket.org/jaraco/irc
IRC 是 Internet Relay Chat 的縮寫。這是用 Python 封裝的第三方庫。
【標準庫】
封裝 telnet 協議
代碼示例——使用 telnet 登陸到某個主機並執行簡單命令
import telnetlib
import getpass
host = raw_input("Enter remote host: ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()
tn = telnetlib.Telnet(host)
tn.read_until("login: ")
tn.write(user + "\n")
if password :
tn.read_until("Password: ")
tn.write(password + "\n")
tn.write("ls\n")
tn.write("exit\n")
print tn.read_all()
Home:https://github.com/citronneur/rdpy
純 Python 實現的 RDP(微軟遠程桌面協議)和 VNC(Virtual Network Computing)客戶端,依賴於 Twisted 庫
【標準庫】
用於解析 URL,提取各個部分的內容。從 Python 2.5 版本開始加入到標準庫中,從 Python 2.7 開始支持包含 IPv6 的 URL
Home:https://developers.google.com/protocol-buffers/
Links:Wikipedia
這是 Google 開發的一個跨語言的庫,用於網絡傳輸業務數據時的「編碼/解碼」。
其優勢是:跨多種語言、高性能、向前兼容、向後兼容。俺前幾年寫過一篇博文推薦 protobuf(在「這裏」)。
做爲 Protocol Buffers 的發明者,Google 默認實現了三種編程語言(C++、Java、Python)對它的支持。
Home:https://thrift.apache.org/
Links:Wikipedia
來自於 Apache 社區,提供了一種跨語言的通信機制。
程序員經過 Thrift 的「接口定義語言」定義通信協議格式,而後 Thrift 根據協議格式自動幫你生成服務端和客戶端代碼。
(在這個方面,它有點相似於 Google 的 Protocol Buffers)
Home:http://twistedmatrix.com/
Links:Wikipedia
這是一個基於 Python 網絡通信開發框架,誕生於2002年,名氣很大。
它的某些設計相似於 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()
這是一個基於協程的網絡庫,原先其底層依賴於 libevent,後來改成 libev。
不少開源項目用到了 gevent,具體參見 gevent 官方的 wiki。
代碼示例——併發執行網絡請求
from gevent import socket
import gevent
hosts = ["google.com", "github.com", "program-think.blogspot.com"]
jobs = [gevent.spawn(socket.gethostbyname, host) for host in hosts]
gevent.joinall(jobs, timeout=2)
print([job.value for job in jobs])
Home:https://github.com/zeromq/pyzmq
這是 ZMQ(ZeroMQ)的 Python 封裝庫。同時支持 Python2 和 Python3。
PyZMQ 2.2 以後的版本同時支持 ZMQ 的 3.x 和 4.x 版本。
Home:https://github.com/tonysimpson/nanomsg-python
這是 nanomsg 的 Python 封裝庫。同時支持 Python2 和 Python3。
代碼示例——Hello world
from __future__ import print_function
from nanomsg import Socket, PAIR, PUB
s1 = Socket(PAIR)
s2 = Socket(PAIR)
s1.bind("inproc://test")
s2.connect("inproc://test")
s1.send(b"hello world")
print(s2.recv())
s1.close()
s2.close()
Home:https://libcloud.apache.org/
現在雲提供商愈來愈多。這個庫提供了統一的 API 讓你訪問各大知名雲提供商提供的各類服務。
代碼示例——建立 DNS 記錄
from libcloud.dns.types import Provider, RecordType
from libcloud.dns.providers import get_driver
cls = get_driver(Provider.ZERIGO)
driver = cls("email", "api key")
zones = driver.list_zones()
zone = [zone for zone in zones if zone.domain == "mydomain.com"][0]
record = zone.create_record(name="www", type=RecordType.A, data="127.0.0.1")
print(record)
爲了便於數據庫開發,Python 社區制定了數據庫的 API 規範(PEP 249)。
只要是涉及到數據庫操做,標準庫和大部分第三方庫都會遵循該規範(請看以下幾個模塊的示例代碼)。
Home:https://github.com/mkleehammer/pyodbc
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()
Home:http://ceodbc.sourceforge.net/
又一個封裝 ODBC API 的第三方庫
Jython 前面已經介紹過。有了它,你能夠基於 JDBC 操做數據庫。
PyWin32 前面已經介紹過。有了它,你能夠基於 ADO 操做數據庫。
IronPython 前面已經介紹過。有了它,你能夠基於 ADO.NET 操做數據庫。
Home:http://mysql-python.sourceforge.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()
Home:http://initd.org/psycopg/
操做 PostgreSQL 的第三方庫。
操做 PostgreSQL 的第三方庫。
Home:http://cx-oracle.sourceforge.net/
操做 Oracle 的第三方庫。
Home:http://pymssql.org/
操做微軟 SQL Server 的第三方庫。
Home:https://pypi.python.org/pypi/ibm_db
操做 DB2 的第三方庫。
【標準庫】
sqlite3 從 Python 2.5 版本開始加入到標準庫中。經過它,你能夠很方便地操做 SQLite 數據庫。
SQLite 是一個很優秀的輕量級數據庫,俺前幾年寫過一篇博文推薦它(在「這裏」)。
代碼示例——建立一個內存數據庫,建表並插入記錄
import sqlite3
conn = sqlite3.connect(":memory:") # ":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()
Docs:https://docs.mongodb.com/ecosystem/drivers/python/
這是 MongoDB 官方提供的 Python 驅動。
Home:https://github.com/wbolster/happybase
操做 HBase 的 Python 庫,基於 Thrift 鏈接到 HBase。
代碼示例——簡單的存取操做
import happybase
connection = happybase.Connection("hostname")
table = connection.table("table-name")
table.put(b"row-key", {b"test1": b"data1", b"test2": b"data2"})
row = table.row(b"row-key")
print(row[b"test1"])
Home:https://github.com/andymccurdy/redis-py
操做 Redis 的第三方 Python 客戶端。
代碼示例——簡單的存取操做
import redis
r = redis.StrictRedis(host="localhost", port=6379, db=0)
r.set("foo", "bar")
print(r.get("foo"))
Home:https://github.com/wbolster/plyvel
操做 LevelDB 的 Python 庫,速度快,同時兼容 Python2 和 Python3。
代碼示例——簡單的存取操做
import plyvel
db = plyvel.DB("/tmp/testdb/", create_if_missing=True)
db.put(b"key", b"value")
print(db.get(b"key"))
db.close()
Home:http://www.jcea.es/programacion/pybsddb.htm
操做 Berkeley DB 的第三方庫。
Home:http://www.sqlalchemy.org/
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"))
Links:Wikipedia
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()
Home:http://www.peewee-orm.com/
一個輕量級的 ORM,支持 SQLite、MySQL 和 PostgreSQL,經過插件機制支持更多數據庫。
同時支持 Python2 和 Python3。
代碼示例——經過對象的方式建立表
from peewee import *
db = SqliteDatabase("test.db")
class Person(Model) :
name = CharField()
birthday = DateField()
is_relative = BooleanField()
class Meta :
database = db # This model uses the "test.db".
class Pet(Model) :
owner = ForeignKeyField(Person, related_name="pets")
name = CharField()
animal_type = CharField()
class Meta :
database = db # This model uses the "test.db".
db.connect()
db.create_tables([Person, Pet])
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()
Home:http://pythoncard.sourceforge.net/
又一個基於 wxWidgets 的 GUI 庫。
GTK+ 全稱是(GIMP Toolkit),由 C 開發的跨平臺界面組件庫。
Links:Wikipedia
它是 Python 對 GTK+2 的封裝。
代碼示例——用 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()
Home:https://live.gnome.org/PyGObject
它是 Python 對 GTK+3 的封裝。PyGTK 的官網也推薦它。
代碼示例——用 PyGObject 寫 Hello world
from gi.repository import Gtk
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Hello World")
self.button = Gtk.Button(label="Click Here")
self.button.connect("clicked", self.on_button_clicked)
self.add(self.button)
def on_button_clicked(self, widget):
print("Hello, world!")
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Qt 是 C++ 開發的跨平臺框架(不只包括 GUI,還有其它功能)。
Home:http://www.riverbankcomputing.com/software/pyqt/
這是 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++ 開發的跨平臺、輕量級界面組件庫。
Home:http://pyfltk.sourceforge.net/
這是 Python 對 FLTK 的封裝。
PyWin32 前面已經介紹過。它能夠提供原生的 Windows GUI 界面。
IronPython 前面已經介紹過。它能夠提供 dotNET 的 GUI 界面。
Jython 前面已經介紹過。它能夠提供基於 Java 的 Swing 界面。
Home:http://easygui.sourceforge.net/
EasyGUI 這是一個很輕量級的庫。跟其它 GUI 不一樣之處在於——它沒有「事件驅動」。
Home:http://www.cosc.canterbury.ac.nz/greg.ewing/python_gui/
PyGUI 是一個更高層的 GUI 庫,底層分別封裝了 PyWin32(Windows 平臺)、PyGTK(Linux 平臺)、PyObjC(Mac OS X 平臺)。
Home:http://kivy.org/
跨平臺的多媒體框架和界面庫,用來開發比較炫的界面。
除了支持桌面操做系統,還支持 Android / iOS,支持多點觸摸。
Home:http://ocemp.sourceforge.net/gui.html
基於 PyGame 的一個跨平臺 GUI 庫(PyGame 下面會提到)。
Links:Wikipedia
這是一個有名的圖形庫,主要用來繪製數學相關的圖形。
它跟後面提到的 SciPy 整合能夠起到相似 MATLAB 的效果。效果圖在「這裏」。
Home:http://gnuplot-py.sourceforge.net/
這是 Python 對 gnuplot 的封裝。gnuplot 的效果圖在「這裏」。
Home:http://www.pyqtgraph.org/
這是一個純 Python 的庫,依賴於 PyQt4 / PySide。效果圖在「這裏」。
Home:http://pyx.sourceforge.net/
這個庫能夠跟 TeX / LaTeX 無縫整合,支持導出爲 PostScript / PDF 格式。適合用來製做報表。效果圖在「這裏」。
Home:http://code.enthought.com/chaco/
這是一個商業公司維護的庫,主要提供2維圖表。效果圖在「這裏」。
【標準庫】
在 Python 2.5 版本加入到標準庫中。經過它,你能夠很方便地計算各類散列值。
它支持的哈希算法有:MD5 SHA1 SHA224 SHA256 SHA384 SHA512
關於散列算法,俺寫過一篇掃盲(在「這裏」)。
代碼示例——計算字符串的 SHA1 散列值
import hashlib
sha1 = hashlib.sha1("Hello, world").hexdigest()
Home:http://www.dlitz.net/software/pycrypto/
這個庫包含了常見的對稱加密算法(DES、AES、IDEA 等)、公鑰加密算法(RSA、DSA 等)、散列算法(MD五、SHA一、RIPEMD 等)。
Home:http://pyopenssl.sourceforge.net/
OpenSSL 在加密領域但是大名鼎鼎。這個庫使用 Python 對 OpenSSL 進行很薄的封裝。
Home:https://github.com/google/keyczar
這是 Google 提供的加密庫,同時提供 C++、Java、Python 三種語言的實現。
它提供了比較高層的 API, 使用者無需關心太多的細節。
Home:https://github.com/google/oauth2client
這是 Google 提供的 OAuth 客戶端,支持 OAuth 2.0 規範。
CSV 是一種歷史悠久的結構化數據存儲格式。其效果相似於一張數據庫二維表。
【標準庫】
提供 CSV 格式文件的讀寫,能夠手動指定行列分隔符。
JSON 格式源自 JavaScript,現在在 Web 開發中廣爲應用。
【標準庫】
提供 JSON 格式的編碼和解碼。
代碼示例——編碼/解碼 JSON 字符串
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]}]
YAML 是一種相似於 json 的結構化數據格式。它在確保可讀性的基礎上,提供了超越 json 的靈活性和擴展性。
Home:http://pyyaml.org/
pyyaml 提供了 Python 對 YAML 的封裝。
【標準庫】
提供對 zip 格式的讀寫。
【標準庫】
提供對 bzip2 格式的讀寫。
【標準庫】
提供對 gzip 格式的讀寫。
【標準庫】
提供對 zlib 格式的讀寫。
【標準庫】
提供對 tar 格式的讀寫。
Home:http://www.joachim-bauch.de/projects/pylzma/
處理 7zip 格式的第三方庫。
Home:http://rarfile.berlios.de/
處理 rar 格式的第三方庫。
【標準庫】
提供對 msi 格式的讀寫,從 Python 2.5 版本開始加入標準庫。
【標準庫】
用 DOM(Document Object Model)方式處理 XML 文件。
【標準庫】
用 SAX(Simple API for XML)方式處理 XML 文件。
Home:http://lxml.de/
著名的 C 語言庫 libxml 和 libxslt 的 Python 封裝。
功能很強,支持 XPath 1.0、XSLT 1.0、擴展 EXSLT、等。還能夠用來解析 HTML 格式。
【標準庫】
以回調方式解析 HTML/XHTML 文件內容。
Home:https://github.com/reingart/pyfpdf
這是 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")
Home:http://knowah.github.com/PyPDF2/
pyPdf 目前已經不繼續升級維護了。PyPDF2 是從 pyPdf 派生出來的,並繼續增長新功能。
它除了能夠提取文件屬性,還能夠切分/合併文檔,加密/解密文檔。
Home:http://www.unixuser.org/~euske/python/pdfminer/
它能夠提取 PDF 文件屬性以及每頁的文本,支持把內容輸出爲 HTML 格式。
Home:https://github.com/python-openxml/python-docx
純 python 實現的 docx 操做庫,可以處理 docx 中的「文本、圖片、樣式」。
同時支持 Python2 和 Python3。
PyWin32 前面已經介紹過。它能夠基於 COM 操做 Office 文檔,包括 Word。
(本地須要安裝 Office)
Home:http://sourceforge.net/projects/pyexcelerator/
它能夠支持 Office Excel(97/2000/XP/2003)以及 OpenOffice Calc 的文檔。無需依賴外部軟件。
PyWin32 前面已經介紹過。它能夠基於 COM 操做 Office 文檔,包括 Excel。
(本地須要安裝 Office)
Home:https://github.com/scanny/python-pptx
它能夠用來生成 pptx(Open XML PowerPoint)格式的文檔。
PyWin32 前面已經介紹過。它能夠基於 COM 操做 Office 文檔,包括 Power Point。
(本地須要安裝 Office)
Home:http://pyrtf.sourceforge.net/
它能夠用來處理 RTF(富文本格式)文檔。
Home:http://gnochm.sourceforge.net/pychm.html
這是基於 chmlib 的 Python 封裝庫。能夠提取 CHM 文件的屬性以及每一個頁面的內容。
Home:http://www.pythonware.com/products/pil/
Links:Wikipedia
這是一個頗有名氣的 Python 圖像處理庫,支持常見圖像文件格式(BMP、JPG、GIF、PNG ...)。
它能夠對圖像進行各類常見的處理(旋轉、縮放、剪切 ...)。
代碼示例——爲某個目錄下全部 JPEG 建立縮略圖
import os, glob
from PIL import Image
size = 128, 128
for file in glob.glob("*.jpg"):
name, ext = os.path.splitext(file)
img = Image.open(file)
img.thumbnail(size)
img.save(name+".thumbnail", "JPEG")
代碼示例——旋轉某圖片並顯示
from PIL import Image
img = Image.open("xxx.jpg")
img = img.rotate(90)
img.show()
它經過前面提到 ctypes 實現了對 ImageMagick 的封裝(ImageMagick 是最強大的開源圖片處理工具集)。
代碼示例——旋轉並縮放某圖片
from wand.image import Image
from wand.display import display
with Image(filename="mona-lisa.png") as img :
print(img.size)
for r in 1, 2, 3 :
with img.clone() as new_img :
new_img.resize(int(new_img.width/2), int(new_img.height/2))
new_img.rotate(90 * r)
new_img.save(filename="mona-lisa-{0}.png".format(r))
display(new_img)
Home:http://python-pillow.org/
你能夠把它視做「輕量級的 PIL」。
它的目標是比 PIL 更容易使用,並儘量與 PIL 的 API 兼容。
Home:https://github.com/pygraphviz/pygraphviz
Graphviz 是一個功能很強大的關係圖【自動】生成工具,具體介紹能夠參見俺的博文(在「這裏」)
這個庫如其名所示,提供了 Python 對 Graphviz 的封裝(基於 SWIG)。
Home:https://github.com/xflr6/graphviz
這個庫與上一個相似,也提供了 Graphviz 的 Python 的封裝。
這兩個庫都在 GitHub 上。(多是由於出現較晚)這個庫的 Star 和 Fork 數都不如上一個,不過俺感受文檔比較全。
代碼示例——建立一個 DOT 圖並加入若干節點和連線
from graphviz import Digraph
dot = Digraph(comment='The Round Table')
# 添加節點
dot.node('A', 'King Arthur')
dot.node('B', 'Sir Bedevere the Wise')
dot.node('L', 'Sir Lancelot the Brave')
# 添加連線
dot.edges(['AB', 'AL'])
dot.edge('B', 'L', constraint='false')
PIL 前面已經介紹過。它支持常見圖像文件格式(BMP、JPG、GIF、PNG ...)之間的相互轉換。
Wand 前面已經介紹過。因爲它是針對 ImageMagick 的封裝。只要 ImageMagick 能轉換的格式,它也能夠轉換。
Home:http://cairographics.org/pycairo/
Cairo 是一個圖像渲染引擎,提供了矢量圖像的渲染功能。支持多種後端輸出(包括:Win32 GDI、OpenGL、Xlib、XCB、PDF、PNG、SVG......)。
Pycairo 是 Cairo 官方提供 Python 封裝。
這是名氣很大的跨平臺遊戲引擎,構建於 SDL(Simple DirectMedia Layer)之上。
它起先是用來替代終止開發的 pySDL,包含了圖像和音頻的庫。
Home:http://cocos2d.org/
它是一個開源的 2D 遊戲框架,最初使用 Python 編寫的。後來該框架已經被移植到了多種語言和平臺上。
其功能包括了:GUI 組件、音效、物理引擎、腳本語言綁定、場景編輯器 ...
不少手機遊戲是基於 Cocos2d 的衍生框架開發的。
它是 Blender 的組成部分,雖然是以 C++ 編寫,但內置了 Python 腳本的擴展。
其功能包括:3D 渲染、碰撞檢測、角色編輯器、音效、網絡通信、AI ...
Home:http://pyopengl.sourceforge.net/
封裝 OpenGL 的 Python 庫。
Home:http://www.python-ogre.org/
封裝 OGRE 的 Python 庫。
它提供了功能強大、性能很高的數值數組,能夠用來進行各類數值計算(包括矩陣運算)。
代碼示例
# 如下是傳統 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
它依賴 NumPy 提供的多維數組。相比 NumPy,它提供了更高層的數學運算模塊(統計、線性代數、積分、常微分方程求解、傅立葉變換、信號處理 ...)。
它被普遍用於科研和工程領域。
Home:http://sympy.org/
它是用來作符號計算的,其目標是成爲一個全功能的「計算機代數系統」。
它支持的功能包括:符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散數學、幾何學、機率與統計 ......
一些不方便歸類的,暫時放到這裏。
Home:http://www.pypy.org/
它是一個用 Python 寫的 Python 解釋器(有點繞口令)。
PyPy 支持 JIT(Just-in-time compilation)和沙箱技術,可作到【比 CPython 更快的運行速度】。