圖片針對父元素居中 TileImg
連結:https://www.zhihu.com/question/20336475/answer/197317130
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
1 演算法
1.1 字串
1.1.1 正則表示式
re
【標準庫】
提供基於正則的匹配和替換。
1.1.2 字符集
chardet
Home:https://github.com/erikrose/chardet
chardet 可以猜測任意一段文字的字符集編碼。對於編碼型別未知的文字,它會很有用。
chardet 既可以作為模組來使用,也可以作為命令列工具來使用。
程式碼示例
import chardet print(chardet.detect(bytes))
1.1.3 (其它)
StringIO & cStringIO
【標準庫】
以讀寫檔案的方式來操作字串(有點類似於記憶體檔案)。
cStringIO 是 C 語言實現的,效能更高;而 StringIO 是 Python 實現的,提供 Unicode 相容性。
difflib
【標準庫】
可以對兩個字串進行“按行”比較,其功能類似於命令列的 diff。
另外還支援“最佳匹配”功能——對給定的字串 s 和字串列表 l,在 l 裡面找到最接近 s 的字串。
1.2 編碼 & 解碼
1.2.1 base64
base64
【標準庫】
提供 Base16、Base32、Base64 格式的編碼和解碼。
1.2.2 UUencode
UUencode出現於早期的 Unix 系統。用於把二進位制編碼為文字,以便通過郵件系統傳送。
uu
【標準庫】
提供 UUencode 格式的編碼和解碼。
1.2.3 BinHex
BinHex起先用於 Mac OS 系統,類似於 UUencode。
binhex
【標準庫】
提供 BinHex 格式的編碼和解碼。
1.3 數學類
math
【標準庫】
顧名思義,這個標準庫封裝了常用的數學函式(開方、指數、對數、三角函式......)。
random
【標準庫】
顧名思義,這個標準庫是用來進行隨機數生成滴。
程式碼示例——生成 0-100 的隨機數
import random
random.seed()
random.randint(0, 100)
fractions
【標準庫】
封裝了跟有理數(分數)相關的運算
1.4 容器
pygtrie
Home:https://github.com/google/pytrie
這是 Google 實現的trie(字首樹/字典樹)封裝庫。
2 跨語言程式設計
Python 可以很容易地跟其它程式語言整合。整合之後,就可以在 Python 程式碼中使用其它程式語言的函式、模組、庫,非常爽!
2.1 整合 C & C++
ctypes
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)
SWIG(Simplified Wrapper and Interface Generator)
Home:http://swig.org/
Links:Wikipedia
這是一個很老牌的、有名氣的工具,它可以把多種語言(Java、Python、C#、Ruby、PHP、Perl、Lua、Go ...)整合到 C/C++ 中。
Cython
Home:http://cython.org/
這個工具可以讓你用 Python 的語法寫擴充套件模組的程式碼,然後它幫你把 Python 程式碼編譯為本地動態庫(機器碼)。
用它編譯出來的擴充套件模組,其效能跟 C/C++ 編寫的擴充套件模組相當。
2.2 整合 JVM 平臺
Jython
通過 Jython 可以讓 Python 程式碼執行在 JVM 上,並且可以呼叫其它的 JVM 語言的程式碼(比如 Java、Scala)
2.3 整合 dotNet 平臺
IronPython
通過 IronPython 可以讓 Python 程式碼執行在 dotNET 平臺上,並且可以呼叫其它的 dotNET 語言的程式碼(C#、F#、http://VB.Net...)
2.4 整合 Go
gopy
Home:https://github.com/go-python/gopy
gopy 可以把 Go 原始碼編譯為 Python 的一個 module。
它提供了兩種方式(命令列、Python 庫)來實現:Go 原始碼編譯為 Python 模組。
2.5 整合 Objective-C
PyObjC
Home:http://pyobjc.sourceforge.net/
這是用 Python 封裝 Mac OS X 上的 Objective-C 庫。
3 作業系統
3.1 檔案和目錄操作
os
【標準庫】
這是非常基本的標準庫,提供了常見的作業系統相關功能,很多功能是針對檔案系統。
shutil
【標準庫】
相對於 os 而言,shutil 提供了一些比較高階的檔案和目錄操作(目錄遞迴複製、目錄遞迴刪除、目錄壓縮打包...)
程式碼示例——遞迴刪除某個目錄
import shutil
shutil.rmtree(xxxx)
glob
【標準庫】
用於查詢檔案,【支援萬用字元】(* 和 ?)
程式碼示例——獲取當前目錄所有 txt 檔案
import glob
for file in glob.glob("./*.txt") :
print(file)
fnmatch
【標準庫】
用於匹配檔名(支援萬用字元,類似上面的 glob)
程式碼示例——列出當前目錄所有 txt 檔案
import os, fnmatch
for file in os.listdir(".") :
if fnmatch.fnmatch(file, "*.txt") :
print(file)
tempfile
【標準庫】
使用它可以安全地生成臨時檔案或臨時目錄。
3.2 執行緒
threading
【標準庫】
提供了比較高層的執行緒封裝 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)
3.3 程序
subprocess
【標準庫】
用於程序管理,可以啟動子程序,通過標準輸入輸出跟子程序互動。
程式碼示例——啟動命令列程序,並獲取該程序的標準輸出
import subprocess
output = subprocess.check_output(["dir"]) # 獲取當前目錄的內容
output = subprocess.check_output(["netstat", "-an"]) # 獲取當前網路連結
multiprocessing
【標準庫】
它是 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()
3.4 本地程序間通訊(IPC)
mmap
【標準庫】
提供了記憶體對映檔案的支援。
程式碼示例——利用 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()
signal
【標準庫】
用於程序訊號處理的標準庫(主要用於 Linux & UNIX 系統)。
3.5 Linux & Unix 系統相關
syslog
【標準庫】
通過它可以很方便地跟 POSIX 的 syslog 服務進行互動。
3.6 Windows 系統相關
PyWin32
Home:http://python.net/crew/mhammond/win32/
這個第三方庫封裝了 Windows API 及 COM API。通過它可以方便地用 Python 進行 Windows 程式設計(呼叫 COM 元件、編寫 Windows 服務、等)。
3.7 程式打包
PyInstaller
Home:http://www.pyinstaller.org/
PyInstaller 可以把你的 Python 程式碼製作成獨立執行的程式(不依賴 Python 環境就可以執行)。
該工具支援多種作業系統,包括:Windows、Linux、Mac OS X、Solaris、AIX、等。
py2exe
Links:Wikipedia
py2exe 的功能類似 PyInstaller,但只支援 Windows 平臺。
py2app
Home:https://bitbucket.org/ronaldoussoren/py2app
它很類似於py2exe,差別在於py2exe支援 Windows 平臺,而py2app支援 Mac OS X 平臺。
EasyInstall & Setuptools
Home:https://pypi.python.org/pypi/setuptools
這套工具可以幫助你進行第三方庫的管理(下載、編譯、安裝、升級、解除安裝)
4 Web
4.1 HTTP Client
httplib & httplib2 & http.request & urllib.parse
【標準庫】
這幾個庫可以進行各種 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()
Requests
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, ...}
4.2 HTTP Server
SimpleHTTPServer & http.server
【標準庫】
提供輕量級 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()
4.3 Web 開發框架
(Python 的 Web 框架數不勝數,俺只挑選幾個代表性的)
Django
Home:https://www.djangoproject.com/
在 Python 社群,Django 是目前最有影響力的 Web 開發框架。該框架很重型,內建了 Web 服務端開發常用的元件(比如:ORM、使用者管理)。
Django 應用範圍很廣,比如 Google 的 Web 開發平臺 GAE 就支援它。
而且它完全支援前面提到的 Jython 執行環境,可以執行在任何 J2EE 伺服器上。
TurboGears
Home:http://www.turbogears.org/
又一個重型的 Web 開發框架,名氣僅次於 Django。
它跟 Django 一樣,都是“Full-Stack Frameworks”。
CherryPy
Links:Wikipedia
輕量級的 Web 框架。某些 Web 框架(比如前面提到的 TurboGears)使用它作為底層。
程式碼示例——Hello world
import cherrypy
class HelloWorld(object):
def index(self):
return "Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
web.py
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()
4.4 Web前端 & JS整合
Pyjamas & pyjs
Home:http://pyjs.org/
這是從 GWT(Google Web Toolkit)移植的第三方庫。提供了 Python 到 JS 的編譯,AJAX 框架等功能。
Pyjamas 甚至能用來開發桌面 GUI 應用。
pyjaco
Home:https://github.com/chrivers/pyjaco
這也是一個 Python 到 JavaScript 的編譯工具。
4.5 瀏覽器整合
webbrowser
【標準庫】
操縱當前系統的預設瀏覽器,訪問指定 URL 的頁面。
程式碼示例——用預設瀏覽器開啟 Google 主頁
import webbrowser
webbrowser.open("http://www.google.com")
pyv8
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() 函式
PyWebKitGtk
Home:https://github.com/jmalonzo/pywebkitgtk
WebKitGtk是一個基於 WebKit 的 Web 渲染引擎。
PyWebKitGtk 則提供了對 WebKitGtk 的 Python 封裝。
4.6 (其它)
pywebsocket
Home:https://github.com/google/pywebsocket
這是 Google 提供的WebSocket服務端。
該專案包含一個可獨立執行的 server 以及一個 Apache 擴充套件模組(mod_pywebsocket)。
5 網路
5.1 鏈路層 & 網路層
Scapy
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)
5.2 傳輸層
socket
Python 標準庫很早就提供了對 socket 程式設計的支援。
這個標準庫是對伯克利套接字進行簡單的封裝,其 API 基本上跟 BSD SOCKET 一一對應。
asyncore
這個標準庫提供了非同步 SOCKET 的支援。
asynchat
這個標準庫基於上述的 asyncore,提供更高層的 API,簡化非同步通訊程式設計。
5.3 標準的應用層
5.3.1 綜合性的庫
PycURL
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()
5.3.2 HTTP
(關於“HTTP 協議”,請參見另一個大類:“Web”)
5.3.3 檔案傳輸
ftplib
【標準庫】
封裝 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()
pysftp
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") # 遞迴複製某個服務端的目錄到本地
5.3.4 電子郵件
smtplib
【標準庫】
封裝 SMTP(Simple Mail Transfer Protocol)協議
imaplib
【標準庫】
封裝 IMAP(Internet Message Access Protocol)協議
poplib
【標準庫】
封裝 POP3(Post Office Protocol v3)協議
5.3.5 即時通訊
jabber.py
Home:http://jabberpy.sourceforge.net/
Jabber(又稱 XMPP)是IM(即時通訊)協議的標準。這是用 Python 封裝的第三方庫。
irclib
Home:https://bitbucket.org/jaraco/irc
IRC 是 Internet Relay Chat 的縮寫。這是用 Python 封裝的第三方庫。
5.3.6 遠端控制
telnetlib
【標準庫】
封裝 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()
rdpy
Home:https://github.com/citronneur/rdpy
純 Python 實現的 RDP(微軟遠端桌面協議)和 VNC(Virtual Network Computing)客戶端,依賴於 Twisted 庫
5.3.7 (其它)
urlparse
【標準庫】
用於解析 URL,提取各個部分的內容。從 Python 2.5 版本開始加入到標準庫中,從 Python 2.7 開始支援包含 IPv6 的 URL
5.4 自定義的應用層
Protocol Buffers
Home:https://developers.google.com/protocol-buffers/
Links:Wikipedia
這是 Google 開發的一個跨語言的庫,用於網路傳輸業務資料時的“編碼/解碼”。
其優點是:跨多種語言、高效能、向前相容、向後相容。俺前幾年寫過一篇博文推薦 protobuf(在“這裡”)。
作為 Protocol Buffers 的發明者,Google 預設實現了三種程式語言(C++、Java、Python)對它的支援。
Apache Thrift
Home:https://thrift.apache.org/
Links:Wikipedia
來自於 Apache 社群,提供了一種跨語言的通訊機制。
程式設計師通過 Thrift 的“介面定義語言”定義通訊協議格式,然後 Thrift 根據協議格式自動幫你生成服務端和客戶端程式碼。
(在這個方面,它有點類似於 Google 的 Protocol Buffers)
5.5 網路庫、框架、中介軟體
Twisted
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()
gevent
這是一個基於協程的網路庫,原先其底層依賴於 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])
PyZMQ
Home:https://github.com/zeromq/pyzmq
這是 ZMQ(ZeroMQ)的 Python 封裝庫。同時支援 Python2 和 Python3。
PyZMQ 2.2 之後的版本同時支援 ZMQ 的 3.x 和 4.x 版本。
nanomsg-python
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()
5.6 雲端計算
Apache Libcloud
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)
6 資料庫
為了便於資料庫開發,Python 社群制定了資料庫的 API 規範(PEP 249)。
只要是涉及到資料庫操作,標準庫和大部分第三方庫都會遵循該規範(請看如下幾個模組的示例程式碼)。
6.1 資料庫中介軟體
6.1.1 ODBC
pyODBC
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()
ceODBC
Home:http://ceodbc.sourceforge.net/
又一個封裝 ODBC API 的第三方庫
6.1.2 JDBC
Jython
Jython 前面已經介紹過。有了它,你可以基於JDBC操作資料庫。
6.1.3 ADO &http://ADO.NET
PyWin32
PyWin32 前面已經介紹過。有了它,你可以基於ADO操作資料庫。
IronPython
IronPython 前面已經介紹過。有了它,你可以基於ADO.NET操作資料庫。
6.2 特定資料庫
6.2.1 MySQL
MySQL for Python
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()
6.2.2 PostgreSQL
psycopg
Home:http://initd.org/psycopg/
操作 PostgreSQL 的第三方庫。
PyGreSQL
操作 PostgreSQL 的第三方庫。
6.2.3 Oracle
cx_Oracle
Home:http://cx-oracle.sourceforge.net/
操作 Oracle 的第三方庫。
6.2.4 MS SQL Server
pymssql
Home:http://pymssql.org/
操作微軟 SQL Server 的第三方庫。
6.2.5 IBM DB2
ibm-db
Home:https://pypi.python.org/pypi/ibm_db
操作 DB2 的第三方庫。
6.2.6 SQLite
sqlite3
【標準庫】
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()
6.2.7 MongoDB
PyMongo
Docs:https://docs.mongodb.com/ecosystem/drivers/python/
這是 MongoDB 官方提供的 Python 驅動。
6.2.8 Apache HBase
HappyBase
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"])
6.2.9 Redis
redis-py
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"))
6.2.10 LevelDB
Plyvel
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()
6.2.11 Berkeley DB
PyBSDDB
Home:http://www.jcea.es/programacion/pybsddb.htm
操作 Berkeley DB 的第三方庫。
6.3 ORM(Object-Relational Mapping)
SQLAlchemy
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"))
SQLObject
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()
Peewee
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])
7 GUI
7.1 GUI 框架
7.1.1 基於 Tk
Tk是一個跨平臺的介面元件庫。
Tkinter & tkinter
【標準庫】
這是 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()
7.1.2 基於 wxWidgets
wxWidgets是 C++ 開發的跨平臺框架(不僅包括 GUI,還有其它功能)。
wxPython
在所有的 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()
PythonCard
Home:http://pythoncard.sourceforge.net/
又一個基於 wxWidgets 的 GUI 庫。
7.1.3 基於 GTK+
GTK+全稱是(GIMP Toolkit),由 C 開發的跨平臺介面元件庫。
PyGTK
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()
PyGObject(PyGI)
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()
7.1.4 基於 Qt
Qt是 C++ 開發的跨平臺框架(不僅包括 GUI,還有其它功能)。
PyQt
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_())
PySide
這也是 Python 對 Qt 的封裝。
7.1.5 基於 FLTK
FLTK全稱是(Fast Light Tool Kit),由 C++ 開發的跨平臺、輕量級介面元件庫。
PyFLTK
Home:http://pyfltk.sourceforge.net/
這是 Python 對 FLTK 的封裝。
7.1.6 基於 Windows 平臺
PyWin32
PyWin32 前面已經介紹過。它可以提供原生的 Windows GUI 介面。
IronPython
IronPython 前面已經介紹過。它可以提供 dotNET 的 GUI 介面。
7.1.7 基於 JVM 平臺
Jython
Jython 前面已經介紹過。它可以提供基於 Java 的Swing介面。
7.1.8 (其它)
EasyGUI
Home:http://easygui.sourceforge.net/
EasyGUI 這是一個很輕量級的庫。跟其它 GUI 不同之處在於——它沒有“事件驅動”。
PyGUI
Home:http://www.cosc.canterbury.ac.nz/greg.ewing/python_gui/
PyGUI 是一個更高層的 GUI 庫,底層分別封裝了PyWin32(Windows 平臺)、PyGTK(Linux 平臺)、PyObjC(Mac OS X 平臺)。
Kivy
Home:http://kivy.org/
跨平臺的多媒體框架和介面庫,用來開發比較炫的介面。
除了支援桌面作業系統,還支援 Android / iOS,支援多點觸控。
OcempGUI
Home:http://ocemp.sourceforge.net/gui.html
基於 PyGame 的一個跨平臺 GUI 庫(PyGame 下面會提到)。
7.2 圖表 & 報表
matplotlib
Links:Wikipedia
這是一個有名的圖形庫,主要用來繪製數學相關的圖形。
它跟後面提到的SciPy整合可以起到類似 MATLAB 的效果。效果圖在“這裡”。
Gnuplot.py
Home:http://gnuplot-py.sourceforge.net/
這是 Python 對gnuplot的封裝。gnuplot 的效果圖在“這裡”。
PyQtGraph
Home:http://www.pyqtgraph.org/
這是一個純 Python 的庫,依賴於 PyQt4 / PySide。效果圖在“這裡”。
PyX
Home:http://pyx.sourceforge.net/
這個庫可以跟 TeX / LaTeX 無縫整合,支援匯出為 PostScript / PDF 格式。適合用來製作報表。效果圖在“這裡”。
Chaco
Home:http://code.enthought.com/chaco/
這是一個商業公司維護的庫,主要提供2維圖表。效果圖在“這裡”。
8 資訊保安
8.1 密碼學
hashlib
【標準庫】
在 Python 2.5 版本加入到標準庫中。通過它,你可以很方便地計算各種雜湊值。
它支援的雜湊演算法有:MD5 SHA1 SHA224 SHA256 SHA384 SHA512
關於雜湊演算法,俺寫過一篇掃盲(在“這裡”)。
程式碼示例——計算字串的 SHA1 雜湊值
import hashlib
sha1 = hashlib.sha1("Hello, world").hexdigest()
PyCrypto
Home:http://www.dlitz.net/software/pycrypto/
這個庫包含了常見的對稱加密演算法(DES、AES、IDEA 等)、公鑰加密演算法(RSA、DSA 等)、雜湊演算法(MD5、SHA1、RIPEMD 等)。
pyOpenSSL
Home:http://pyopenssl.sourceforge.net/
OpenSSL在加密領域可是大名鼎鼎。這個庫使用 Python 對 OpenSSL 進行很薄的封裝。
Keyczar
Home:https://github.com/google/keyczar
這是 Google 提供的加密庫,同時提供 C++、Java、Python 三種語言的實現。
它提供了比較高層的 API, 使用者無需關心太多的細節。
8.2 訪問控制
oauth2client
Home:https://github.com/google/oauth2client
這是 Google 提供的 OAuth 客戶端,支援 OAuth 2.0 規範。
9 處理檔案格式
9.1 結構化資料格式
9.1.1 CSV
CSV是一種歷史悠久的結構化資料儲存格式。其效果類似於一張資料庫二維表。
csv
【標準庫】
提供 CSV 格式檔案的讀寫,可以手動指定行列分隔符。
9.1.2 JSON
JSON 格式源自 JavaScript,如今在 Web 開發中廣為應用。
json
【標準庫】
提供 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]}]
9.1.3 YAML
YAML是一種類似於 json 的結構化資料格式。它在確保可讀性的基礎上,提供了超越 json 的靈活性和擴充套件性。
PyYAML
Home:http://pyyaml.org/
pyyaml 提供了 Python 對 YAML 的封裝。
9.2 壓縮檔案 & 打包檔案
9.2.1 zip
zipfile
【標準庫】
提供對 zip 格式的讀寫。
9.2.2 bzip2(bz2)
bz2
【標準庫】
提供對 bzip2 格式的讀寫。
9.2.3 gzip(gz)
gzip
【標準庫】
提供對 gzip 格式的讀寫。
zlib
【標準庫】
提供對 zlib 格式的讀寫。
9.2.4 tar
tarfile
【標準庫】
提供對 tar 格式的讀寫。
9.2.5 7zip(7z)
PyLZMA
Home:http://www.joachim-bauch.de/projects/pylzma/
處理 7zip 格式的第三方庫。
9.2.6 rar
rarfile
Home:http://rarfile.berlios.de/
處理 rar 格式的第三方庫。
9.2.7 msi
msilib
【標準庫】
提供對 msi 格式的讀寫,從 Python 2.5 版本開始加入標準庫。
9.3 標記語言
9.3.1 XML
xml.dom & xml.miniDom & xml.etree.ElementTree
【標準庫】
用 DOM(Document Object Model)方式處理 XML 檔案。
xml.sax & xml.parsers.expat
【標準庫】
用 SAX(Simple API for XML)方式處理 XML 檔案。
lxml
Home:http://lxml.de/
著名的 C 語言庫 libxml 和 libxslt 的 Python 封裝。
功能很強,支援 XPath 1.0、XSLT 1.0、擴充套件 EXSLT、等。還可以用來解析 HTML 格式。
9.3.2 HTML
HTMLParser
【標準庫】
以回撥方式解析 HTML/XHTML 檔案內容。
9.4 PDF
pyfpdf
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")
pyPdf & PyPDF2
Home:http://knowah.github.com/PyPDF2/
pyPdf 目前已經不繼續升級維護了。PyPDF2 是從 pyPdf 派生出來的,並繼續增加新功能。
它除了可以提取檔案屬性,還可以切分/合併文件,加密/解密文件。
PDFMiner
Home:http://www.unixuser.org/~euske/python/pdfminer/
它可以提取 PDF 檔案屬性以及每頁的文字,支援把內容輸出為 HTML 格式。
9.5 MS Office 文件
9.5.1 Word(doc、docx)
python-docx
Home:https://github.com/python-openxml/python-docx
純 python 實現的 docx 操作庫,能夠處理 docx 中的“文字、圖片、樣式”。
同時支援 Python2 和 Python3。
PyWin32
PyWin32 前面已經介紹過。它可以基於COM操作 Office 文件,包括 Word。
(本地需要安裝 Office)
9.5.2 Excel(xls、xlsx)
pyExcelerator
Home:http://sourceforge.net/projects/pyexcelerator/
它可以支援 Office Excel(97/2000/XP/2003)以及 OpenOffice Calc 的文件。無需依賴外部軟體。
PyWin32
PyWin32 前面已經介紹過。它可以基於COM操作 Office 文件,包括 Excel。
(本地需要安裝 Office)
9.5.3 Power Point(ppt、pptx)
python-pptx
Home:https://github.com/scanny/python-pptx
它可以用來生成 pptx(Open XML PowerPoint)格式的文件。
PyWin32
PyWin32 前面已經介紹過。它可以基於COM操作 Office 文件,包括 Power Point。
(本地需要安裝 Office)
9.6 RTF
PyRTF
Home:http://pyrtf.sourceforge.net/
它可以用來處理 RTF(富文字格式)文件。
9.7 CHM
PyCHM
Home:http://gnochm.sourceforge.net/pychm.html
這是基於chmlib的 Python 封裝庫。可以提取 CHM 檔案的屬性以及每個頁面的內容。
10 影象
10.1 影象處理
Python Imaging Library(PIL)
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()
Wand
它通過前面提到 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)
Pillow
Home:http://python-pillow.org/
你可以把它視作“輕量級的 PIL”。
它的目標是比 PIL 更容易使用,並儘可能與 PIL 的 API 相容。
PyGraphviz
Home:https://github.com/pygraphviz/pygraphviz
Graphviz是一個功能很強大的關係圖【自動】生成工具,具體介紹可以參見俺的博文(在“這裡”)
這個庫如其名所示,提供了 Python 對 Graphviz 的封裝(基於 SWIG)。
Graphviz
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')
10.2 影象格式轉換
Python Imaging Library(PIL)
PIL 前面已經介紹過。它支援常見影象檔案格式(BMP、JPG、GIF、PNG ...)之間的相互轉換。
Wand
Wand 前面已經介紹過。由於它是針對ImageMagick的封裝。只要 ImageMagick 能轉換的格式,它也可以轉換。
10.3 影象渲染
Pycairo
Home:http://cairographics.org/pycairo/
Cairo是一個影象渲染引擎,提供了向量影象的渲染功能。支援多種後端輸出(包括:Win32 GDI、OpenGL、Xlib、XCB、PDF、PNG、SVG......)。
Pycairo 是 Cairo 官方提供 Python 封裝。
11 遊戲
11.1 綜合性的遊戲引擎
PyGame
這是名氣很大的跨平臺遊戲引擎,構建於SDL(Simple DirectMedia Layer)之上。
它起先是用來替代終止開發的 pySDL,包含了影象和音訊的庫。
Cocos2d
Home:http://cocos2d.org/
它是一個開源的 2D 遊戲框架,最初使用 Python 編寫的。後來該框架已經被移植到了多種語言和平臺上。
其功能包括了:GUI 元件、音效、物理引擎、指令碼語言繫結、場景編輯器 ...
很多手機遊戲是基於 Cocos2d 的衍生框架開發的。
Blender Game Engine
它是Blender的組成部分,雖然是以 C++ 編寫,但內建了 Python 指令碼的擴充套件。
其功能包括:3D 渲染、碰撞檢測、角色編輯器、音效、網路通訊、AI ...
11.2 3D 渲染引擎
PyOpenGL
Home:http://pyopengl.sourceforge.net/
封裝OpenGL的 Python 庫。
Python-Ogre
Home:http://www.python-ogre.org/
封裝OGRE的 Python 庫。
12 數值計算 & 科學計算
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,它提供了更高層的數學運算模組(統計、線性代數、積分、常微分方程求解、傅立葉變換、訊號處理 ...)。
它被廣泛用於科研和工程領域。
SymPy
Home:http://sympy.org/
它是用來做符號計算的,其目標是成為一個全功能的“計算機代數系統”。
它支援的功能包括:符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散數學、幾何學、概率與統計 ......
13 (其它)
一些不方便歸類的,暫時放到這裡。
PyPy
Home:http://www.pypy.org/
它是一個用 Python 寫的 Python 直譯器(有點繞口令)。
PyPy 支援 JIT(Just-in-time compilation)和沙箱技術,可做到【比 CPython 更快的執行速度】。