正則表達(dá)式的標(biāo)準(zhǔn)庫(kù)。
以讀寫(xiě)文件的方式來(lái)操作字符串(有點(diǎn)類(lèi)似于內(nèi)存文件)。
cStringIO 是 C 語(yǔ)言實(shí)現(xiàn)的,提供高性能;而 StringIO 是 Python 實(shí)現(xiàn)的,提供 Unicode 兼容性。
chardet 可以猜測(cè)任意一段文本的字符集編碼。對(duì)于編碼類(lèi)型未知的文本,它會(huì)很有用。
chardet 既可以作為模塊來(lái)使用,也可以作為命令行工具來(lái)使用。
代碼示例
import chardet PRint chardet.detect(bytes)1.2 數(shù)學(xué)類(lèi)
math
這個(gè)標(biāo)準(zhǔn)庫(kù)顧名思義,封裝了常用的數(shù)學(xué)函數(shù)(開(kāi)方、指數(shù)、對(duì)數(shù)、三角函數(shù)、等)
random
這個(gè)標(biāo)準(zhǔn)庫(kù)顧名思義,是用來(lái)進(jìn)行隨機(jī)數(shù)生成的
代碼示例
# 生成 0-100 的隨機(jī)數(shù) import random random.seed() random.randint(0, 100)fractions
這個(gè)標(biāo)準(zhǔn)庫(kù)封裝了跟有理數(shù)(分?jǐn)?shù))相關(guān)的運(yùn)算
1.3 安全類(lèi)
hashlib
在 Python 2.5 版本加入到標(biāo)準(zhǔn)庫(kù)中。通過(guò)它,你可以很方便地計(jì)算各種散列值。
它支持的哈希算法有:md5 SHA1 SHA224 SHA256 SHA384 SHA512
關(guān)于散列算法,俺寫(xiě)過(guò)一篇掃盲(在這里)。
代碼示例
# 計(jì)算字符串的 SHA1 散列值 import hashlib sha1 = hashlib.sha1('Hello world').hexdigest()PyCrypto
這個(gè)庫(kù)包含了常見(jiàn)的對(duì)稱(chēng)加密算法(DES、AES、IDEA、等)、公鑰加密算法(RSA、DSA、等)、散列算法(MD5、SHA1、RipEMD、等)。
pyOpenSSL
OpenSSL 在加密領(lǐng)域可是大名鼎鼎。這個(gè)庫(kù)使用 Python 對(duì) OpenSSL 進(jìn)行很薄的封裝。
2 跨編程語(yǔ)言
Python 可以很容易地跟其它編程語(yǔ)言整合。整合之后,就可以在 Python 代碼中使用其它編程語(yǔ)言的函數(shù)、模塊、庫(kù),非常爽!
2.1 整合 C / C++ 語(yǔ)言
ctypes
ctypes 在 Python 2.5 版本加入到標(biāo)準(zhǔn)庫(kù)中。
通過(guò)它,你可以很方便地調(diào)用 C/C++ 動(dòng)態(tài)庫(kù)導(dǎo)出的函數(shù),可以在 Python 中使用各種 C/C++ 的數(shù)據(jù)類(lèi)型(比如指針)。
代碼示例
# 調(diào)用 linux/Unix 系統(tǒng)的標(biāo)準(zhǔn) C 函數(shù),獲取當(dāng)前時(shí)間 from ctypes import * libc = CDLL('libc.so.6') time = libc.time(None) # 調(diào)用 Windows 系統(tǒng) 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
這是一個(gè)很老牌的、有名氣的工具,它可以把多種語(yǔ)言(java、Python、C#、Ruby、php、Perl、Lua、Go、等)整合到 C/C++ 中。
Cython
這個(gè)工具可以讓你用 Python 的語(yǔ)法寫(xiě)擴(kuò)展模塊的代碼,然后它幫你把 Python 代碼編譯為本地動(dòng)態(tài)庫(kù)(機(jī)器碼)。
用它編譯出來(lái)的擴(kuò)展模塊,其性能跟 C/C++ 編寫(xiě)的擴(kuò)展模塊相當(dāng)。
2.2 整合 JVM 平臺(tái)
Jython
通過(guò) Jython 可以讓 Python 代碼運(yùn)行在 JVM 上,并且可以調(diào)用其它的 JVM 語(yǔ)言的代碼(比如 Java Scale)
2.3 整合 dotNet 平臺(tái)
IronPython
通過(guò) IronPython 可以讓 Python 代碼運(yùn)行在 dotNET 平臺(tái)上,并且可以調(diào)用其它的 dotNET 語(yǔ)言的代碼(比如 C# F#)
2.4 整合 Objective-C 語(yǔ)言
PyObjC
這是用 Python 封裝 Mac OS X 上的 Objective-C 庫(kù)。
3 操作系統(tǒng)相關(guān)
os
這是一個(gè)非常基本的標(biāo)準(zhǔn)庫(kù),提供了常見(jiàn)的操作系統(tǒng)相關(guān)操作。
3.1 文件和目錄操作
shutil
相對(duì)于 os 標(biāo)準(zhǔn)庫(kù),shutil 標(biāo)準(zhǔn)庫(kù)提供了一些比較高級(jí)的文件和目錄操作(目錄遞歸復(fù)制、目錄遞歸刪除、目錄壓縮打包、等)
代碼示例
# 遞歸刪除某個(gè)目錄 import shutil shutil.rmtree(xxxx)glob
這個(gè)標(biāo)準(zhǔn)庫(kù)用于查找文件(支持通配符)
代碼示例
# 獲取當(dāng)前目錄所有 txt 文件 import glob files = glob.glob('./*.txt')fnmatch
這個(gè)標(biāo)準(zhǔn)庫(kù)用于匹配文件名(支持通配符)
代碼示例
# 列出當(dāng)前目錄所有 txt 文件 import os, fnmatch for file in os.listdir('.') : if fnmatch.fnmatch(file, '*.txt') : print(file)tempfile
使用這個(gè)標(biāo)準(zhǔn)庫(kù),可以安全地生成臨時(shí)文件或臨時(shí)目錄。
3.2 本地進(jìn)程間通信(IPC)
subprocess / multiprocessing
用于進(jìn)程管理的標(biāo)準(zhǔn)庫(kù),可以啟動(dòng)子進(jìn)程,通過(guò)標(biāo)準(zhǔn)輸入輸出跟子進(jìn)程交互。
其中 multiprocessing 是 2.6 版本加入到標(biāo)準(zhǔn)庫(kù)的。
signal
用于進(jìn)程信號(hào)處理的標(biāo)準(zhǔn)庫(kù)。
mmap
提供了內(nèi)存映射文件的支持。
代碼示例
# 利用 mmap 在父子進(jìn)程間交換數(shù)據(jù) import os import mmap map = mmap.mmap(-1, 13) map.write("Hello world") pid = os.fork() if pid == 0: # 子進(jìn)程 map.seek(0) print map.readline() map.close()3.3 Windows 系統(tǒng)相關(guān)
PyWin32
這個(gè)第三方庫(kù)封裝了 Windows API 及 COM API。通過(guò)它可以方便地用 Python 進(jìn)行 Windows 編程(調(diào)用 COM 組件、編寫(xiě) Windows 服務(wù)、等)。
3.4 Linux / Unix 系統(tǒng)相關(guān)
syslog
通過(guò)這個(gè)標(biāo)準(zhǔn)庫(kù),可以很方便地跟 POSIX 的 syslog 服務(wù)進(jìn)行交互。
3.5 程序打包
PyInstaller
PyInstaller 可以把你的 Python 代碼制作成獨(dú)立運(yùn)行的程序(不依賴(lài) Python 環(huán)境就可以運(yùn)行)。
該工具支持多種操作系統(tǒng),包括:Windows、Linux、Mac OS X、Solaris、AIX、等。
py2exe
py2exe 的功能類(lèi)似 PyInstaller,但只支持 Windows 平臺(tái)。
py2app
它很類(lèi)似于 py2exe,差別在于 py2exe 支持 Windows 平臺(tái),而 py2app 支持 Mac OS X 平臺(tái)。
EasyInstall / Setuptools
這套工具可以幫助你進(jìn)行第三方庫(kù)的管理(下載、編譯、安裝、升級(jí)、卸載)
4 Web 開(kāi)發(fā)
如今 Web 開(kāi)發(fā)很火,俺把 Web 相關(guān)的單獨(dú)分一類(lèi)。
4.1 HTTP 協(xié)議
httplib / httplib2 / http.request / urllib.parse
這幾個(gè)庫(kù)可以進(jìn)行各種 HTTP 客戶(hù)端請(qǐng)求(GET、POST、等)。
Python2 的模塊名叫 httplib / httplib2,到 Python3 模塊名改為 http.request / urllib.parse
代碼示例
# 讀取指定 URL 的網(wǎng)頁(yè)內(nèi)容 import urllib handle = urllib.urlopen('http://www.google.com') page = handle.read() handle.close()4.2 Web Server
SimpleHTTPServer / http.server
提供輕量級(jí) HTTP Server 的標(biāo)準(zhǔn)庫(kù)。
Python2 的模塊名叫 SimpleHTTPServer,到 Python3 模塊名改為 http.server
代碼示例
#一個(gè)極簡(jiǎn)單的 HTTP 服務(wù) import SocketServer import SimpleHTTPServer PORT = 8000 Handler = SimpleHTTPServer.SimpleHTTPRequestHandler httpd = SocketServer.TCPServer(('', PORT), Handler) print 'serving at port', PORT httpd.serve_forever()4.3 Web 開(kāi)發(fā)框架
Django
在 Python 社區(qū),Django 是目前最有影響力的 Web 開(kāi)發(fā)框架。該框架很重型,內(nèi)置了 Web 服務(wù)端開(kāi)發(fā)常用的組件。
Django 應(yīng)用范圍很廣,比如 Google 的 Web 開(kāi)發(fā)平臺(tái) GAE 就支持它。
Django 完全支持前面提到的 Jython 運(yùn)行環(huán)境,可以運(yùn)行在任何 J2EE 服務(wù)器上。
TurboGears
又一個(gè)重型的 Web 開(kāi)發(fā)框架,名氣僅次于 Django。
Tornado
這是 FriendFeed 開(kāi)發(fā)的 Web 框架。FriendFeed 被 Facebook 收購(gòu)之后,該框架被開(kāi)源。
Flask
這是一個(gè)很輕量級(jí)的 Web 框架,但是擴(kuò)展性很好。
代碼示例
# 用 Flask 寫(xiě) Hello world from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()4.4 Web前端 / JS整合
Pyjamas / pyjs
這是從 GWT(Google Web Toolkit)移植的第三方庫(kù)。提供了 Python 到 JS 的編譯,Ajax 框架等功能。 Pyjamas 甚至能用來(lái)開(kāi)發(fā)桌面 GUI 應(yīng)用。
pyjaco
這也是一個(gè) Python 到 Javascript 的編譯工具。
4.5 瀏覽器整合
webbrowser
操縱當(dāng)前系統(tǒng)的默認(rèn)瀏覽器,訪問(wèn)指定 URL 的頁(yè)面。
代碼示例
# 用默認(rèn)瀏覽器打開(kāi) Google 主頁(yè) import webbrowser webbrowser.open('http://www.google.com')pyv8
v8 是 Google 開(kāi)發(fā)的 JavaScript 解釋引擎。這是對(duì) v8 引擎的 Python 封裝。
代碼示例
import PyV8 ctxt1 = PyV8.JSContext() ctxt1.enter() ctxt1.eval('1+2') # 對(duì) JS 表達(dá)式求值 class Global(PyV8.JSClass) : # 定義一個(gè)兼容 JS 的類(lèi) def hello(self) : print 'Hello world' ctxt2 = PyV8.JSContext(Global()) # 創(chuàng)建一個(gè) JS 上下文,傳入 Global 類(lèi)的對(duì)象 ctxt2.enter() ctxt2.eval('hello()') # 調(diào)用 hello() 函數(shù)PyWebKitGtk
WebKitGtk 是一個(gè)基于 WebKit 的 Web 渲染引擎。這是 WebKitGtk 的 Python 封裝。
5 網(wǎng)絡(luò)編程
5.1 標(biāo)準(zhǔn)協(xié)議
5.1.1 鏈路層 / 網(wǎng)絡(luò)層
Scapy
這是一個(gè)底層的網(wǎng)絡(luò)庫(kù),可以在不同協(xié)議層次構(gòu)造網(wǎng)絡(luò)數(shù)據(jù)包(包括鏈路層、網(wǎng)絡(luò)層、傳輸層),還支持 Sniffer 抓包。
搞網(wǎng)絡(luò)安全的網(wǎng)友應(yīng)該會(huì)喜歡這個(gè)庫(kù)。
代碼示例
# 傳統(tǒng)的 ping 掃描(網(wǎng)絡(luò)層) ans,unans = sr(IP(dst='192.168.1.1-254')/ICMP()) # 局域網(wǎng)內(nèi)的 ARP 掃描(鏈路層) ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=2)5.1.2 傳輸層
socket
Python 標(biāo)準(zhǔn)庫(kù)很早就提供了對(duì) socket 編程的支持。
這個(gè)標(biāo)準(zhǔn)庫(kù)是對(duì)伯克利套接字進(jìn)行簡(jiǎn)單的封裝,其 API 基本上跟 BSD SOCKET 一一對(duì)應(yīng)。
asyncore
這個(gè)標(biāo)準(zhǔn)庫(kù)提供了異步 SOCKET 的支持。
asynchat
這個(gè)標(biāo)準(zhǔn)庫(kù)基于上述的 asyncore,提供更高層的 API,簡(jiǎn)化異步通訊編程。
5.1.3 應(yīng)用層
ftplib
封裝 FTP 協(xié)議(文件傳輸)的標(biāo)準(zhǔn)庫(kù)
smtplib
封裝 SMTP 協(xié)議(郵件發(fā)送)的標(biāo)準(zhǔn)庫(kù)
imaplib
封裝 IMAP 協(xié)議(郵件接收)的標(biāo)準(zhǔn)庫(kù)
poplib
封裝 POP3 協(xié)議(郵件接收)的標(biāo)準(zhǔn)庫(kù)
PycURL
cURL 是一個(gè)功能很強(qiáng)的網(wǎng)絡(luò)庫(kù)/網(wǎng)絡(luò)工具,支持 N 多應(yīng)用層協(xié)議。這是用 Python 封裝的第三方庫(kù)。
關(guān)于 cURL,俺前幾年寫(xiě)過(guò)一篇博文推薦它(在這里)。
jabber.py
Jabber(又稱(chēng) XMPP)是IM(即時(shí)通信)協(xié)議的標(biāo)準(zhǔn)。這是用 Python 封裝的第三方庫(kù)。
irclib
IRC 是 Internet Relay Chat 的縮寫(xiě)。這是用 Python 封裝的第三方庫(kù)。
5.2 編碼和解碼
json
標(biāo)準(zhǔn)庫(kù),提供 JSON 格式的編碼和解碼。
JSON 格式如今在 Web 開(kāi)發(fā)中廣為應(yīng)用。
代碼示例
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 解碼 # 得到如下對(duì)象 # [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]base64
標(biāo)準(zhǔn)庫(kù),提供 Base16、Base32、Base64 格式的編碼和解碼。
binhex
標(biāo)準(zhǔn)庫(kù),提供 binhex4 格式的編碼和解碼。
uu
標(biāo)準(zhǔn)庫(kù),提供 uuencode 格式的編碼和解碼。
Protocol Buffers(protobuf)
這是 Google 開(kāi)發(fā)的一個(gè)跨語(yǔ)言的庫(kù),用于網(wǎng)絡(luò)傳輸?shù)木幋a和解碼。
它的優(yōu)點(diǎn)是:跨多種語(yǔ)言、高性能、向前兼容、向后兼容。俺前幾年寫(xiě)過(guò)一篇博文推薦 protobuf(在這里)。
5.3 網(wǎng)絡(luò)開(kāi)發(fā)框架
Twisted
這是一個(gè)基于 Python 網(wǎng)絡(luò)通訊開(kāi)發(fā)框架,有十多年歷史,名氣很大。
它的某些設(shè)計(jì)類(lèi)似于 C++ 的 ACE 框架。除了能用來(lái)進(jìn)行傳輸層(TCP UDP)的開(kāi)發(fā),還提供了若干應(yīng)用層協(xié)議(HTTP、XMPP、SSH、IRC、等)的支持。
代碼示例
# 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Echo 服務(wù),監(jiān)聽(tīng)在 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()
6 數(shù)據(jù)庫(kù)
為了便于數(shù)據(jù)庫(kù)開(kāi)發(fā),Python 社區(qū)制定了數(shù)據(jù)庫(kù)的 API 規(guī)范(PEP 249)。
只要是涉及到數(shù)據(jù)庫(kù)操作,標(biāo)準(zhǔn)庫(kù)和大部分第三方庫(kù)都會(huì)遵循該規(guī)范。請(qǐng)看如下幾個(gè)模塊的示例代碼。
6.1 數(shù)據(jù)庫(kù)中間件
6.1.1 ODBC
pyODBC
pyODBC 封裝了 ODBC API,通過(guò)它可以訪問(wèn)各種數(shù)據(jù)庫(kù)(只要有 ODBC 驅(qū)動(dòng)即可)。
代碼示例
# 查詢(xún)某個(gè) ODBC 數(shù)據(jù)源的某個(gè)表 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
又一個(gè)封裝 ODBC API 的第三方庫(kù)
6.1.2 JDBC
Jython
Jython 前面提到過(guò)。它可以基于 JDBC 操作數(shù)據(jù)庫(kù)。
6.1.3 ADO / ADO.NET
PyWin32
PyWin32 前面提到過(guò)。它可以基于 ADO 操作數(shù)據(jù)庫(kù)。
IronPython
IronPython 前面提到過(guò)。它可以基于 ADO.NET 操作數(shù)據(jù)庫(kù)。
6.2 特定數(shù)據(jù)庫(kù)
6.2.1 MySQL
MySQL for Python
操作 MySQL 的第三方庫(kù)。
代碼示例
# 查詢(xún)某個(gè) MySQL 數(shù)據(jù)庫(kù)的某個(gè)表 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
操作 PostgreSQL 的第三方庫(kù)。
psycopg
操作 PostgreSQL 的第三方庫(kù)。
6.2.3 Oracle
cx_Oracle
操作 Oracle 的第三方庫(kù)。
6.2.4 MS SQL Server
pymssql
操作微軟 SQL Server 的第三方庫(kù)。
6.2.5 IBM DB2
ibm-db
操作 DB2 的第三方庫(kù)。
6.2.6 SQLite
sqlite3
sqlite3 從 Python 2.5 版本開(kāi)始加入到標(biāo)準(zhǔn)庫(kù)中。通過(guò)它,你可以很方便地操作 SQLite 數(shù)據(jù)庫(kù)。
SQLite 是一個(gè)很優(yōu)秀的輕量級(jí)數(shù)據(jù)庫(kù),俺前幾年寫(xiě)過(guò)一篇博文推薦它(在這里)。
代碼示例
# 創(chuàng)建一個(gè)內(nèi)存數(shù)據(jù)庫(kù),建表并插入記錄 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()6.2.7 Berkeley DB
PyBSDDB
操作 Berkeley DB 的第三方庫(kù)。
6.3 ORM(Object-Relational Mapping)
SQLAlchemy
SQLAlchemy 支持的數(shù)據(jù)庫(kù)有:MySQL、PostgreSQL、Sqlite、Oracle、MS SQL Server、Firebird、Sybase SQL Server、Informix、等。
代碼示例
# 通過(guò)對(duì)象的方式創(chuàng)建兩張依賴(lài)關(guān)系的表 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
SQLObject 支持的數(shù)據(jù)庫(kù)有:MySQL、PostgreSQL、Sqlite、MS SQL Server、Firebird、Sybase SQL Server、SAP DB、等。
代碼示例
# 通過(guò)對(duì)象的方式創(chuàng)建表 from sqlobject import * sqlhub.processConnection = connectionForURI('sqlite:/:memory:') class Person(SQLObject) : first_name = StringCol() last_name = StringCol() Person.createTable()
7 桌面 GUI 開(kāi)發(fā)
7.1 GUI 框架 / 組件庫(kù)
7.1.1 基于 Tk
Tk 是一個(gè)跨平臺(tái)的界面組件庫(kù)。
Tkinter / tkinter
這是 Python 內(nèi)置的標(biāo)準(zhǔn)庫(kù),封裝了 Tcl/Tk 界面庫(kù)。
Python2 的模塊名叫 Tkinter,到 Python3 模塊名改為 tkinter
代碼示例
# 用 Tkinter 寫(xiě) 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++ 開(kāi)發(fā)的跨平臺(tái)框架(不僅包括 GUI,還有其它功能)。
wxPython
在所有的 wxWidgets 的 Python 封裝庫(kù)中,這個(gè)是名氣最大的。
Ulipad(知名的國(guó)產(chǎn)的 Python IDE)就是基于 wxPython 開(kāi)發(fā)的。
代碼示例
# 用 wxPython 寫(xiě) 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
又一個(gè)基于 wxWidgets 的 GUI 庫(kù)。
7.1.3 基于 GTK+
GTK+ 全稱(chēng)是(GIMP Toolkit),由 C 開(kāi)發(fā)的跨平臺(tái)界面組件庫(kù)。
PyGTK
這是 Python 對(duì) GTK 的封裝。
代碼示例
# 用 PyGTK 寫(xiě) 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()7.1.4 基于 Qt
Qt 是 C++ 開(kāi)發(fā)的跨平臺(tái)框架(不僅包括 GUI,還有其它功能)。
PyQt
這是 Python 對(duì) Qt 的封裝。
代碼示例
# 用 pyQt 寫(xiě) 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 對(duì) Qt 的封裝。
7.1.5 基于 FLTK
FLTK 全稱(chēng)是( Fast Light Tool Kit),由 C++ 開(kāi)發(fā)的跨平臺(tái)、輕量級(jí)界面組件庫(kù)。
PyFLTK
這是 Python 對(duì) FLTK 的封裝。
7.1.6 基于 Windows 平臺(tái)
PyWin32
PyWin32 前面提到過(guò)。它可以提供原生的 Windows GUI 界面。
IronPython
IronPython 前面提到過(guò)。它可以提供 dotNET 的 GUI 界面。
7.1.7 基于 JVM 平臺(tái)
Jython
Jython 前面提到過(guò)。它可以提供基于 Java 的 Swing 界面。
7.1.8 其它
EasyGUI
EasyGUI 這是一個(gè)很輕量級(jí)的庫(kù)。跟其它 GUI 不同之處在于——沒(méi)有事件驅(qū)動(dòng)。
PyGUI
PyGUI 是一個(gè)更高層的 GUI 庫(kù),底層分別封裝了 PyWin32(Windows 平臺(tái))、PyGTK(Linux 平臺(tái))、PyObjC(Mac OS X 平臺(tái))。
Kivy
跨平臺(tái)的多媒體框架和界面庫(kù),用來(lái)開(kāi)發(fā)比較炫的界面。
除了支持桌面操作系統(tǒng),還支持 Android / iOS,支持多點(diǎn)觸摸。
OcempGUI
基于 PyGame 的一個(gè)跨平臺(tái) GUI 庫(kù)。PyGame 下面會(huì)提到。
7.2 圖表/報(bào)表
matplotlib
這是一個(gè)有名的圖形庫(kù),主要用來(lái)繪制數(shù)學(xué)相關(guān)的圖形。
跟后面提到的 SciPy 整合可以起到類(lèi)似 MATLAB 的效果。效果圖在“這里”。
Gnuplot.py
這是 Python 對(duì) gnuplot 的封裝。gnuplot 的效果圖在“這里”。
PyQtGraph
這是一個(gè)純 Python 的庫(kù),依賴(lài)于 PyQt4 / PySide。效果圖在“這里”。
PyX
這個(gè)庫(kù)可以跟 TeX / LaTeX 無(wú)縫整合,支持導(dǎo)出為 PostScript / PDF 格式。適合用來(lái)制作報(bào)表。效果圖在“這里”。
Chaco
這是一個(gè)商業(yè)公司維護(hù)的庫(kù),主要提供2維圖表。效果圖在“這里”。
8 處理文件格式
8.1 處理壓縮文件 / 打包文件
8.1.1 zip
zipfile
處理 zip 格式的標(biāo)準(zhǔn)庫(kù)。
8.1.2 bzip2(bz2)
bz2
處理 bzip2 格式的標(biāo)準(zhǔn)庫(kù)。
8.1.3 gzip(gz)
gzip
處理 gzip 格式的標(biāo)準(zhǔn)庫(kù)。
zlib
處理 gzip 格式的標(biāo)準(zhǔn)庫(kù)。
8.1.4 tar
tarfile
處理 tar 格式的標(biāo)準(zhǔn)庫(kù)。
8.1.5 7zip(7z)
PyLZMA
處理 7zip 格式的第三方庫(kù)。
8.1.6 rar
rarfile
處理 rar 格式的第三方庫(kù)。
8.1.7 msi
msilib
處理 msi 格式的標(biāo)準(zhǔn)庫(kù),從 Python 2.5 版本開(kāi)始提供。
8.2 處理標(biāo)記語(yǔ)言
8.2.1 xml
xml.dom / xml.miniDom / xml.etree.ElementTree
用 DOM(Document Object Model)方式處理 XML 文件的標(biāo)準(zhǔn)庫(kù)。
xml.sax / xml.parsers.expat
用 SAX(Simple API for XML)方式處理 XML 文件的標(biāo)準(zhǔn)庫(kù)。
lxml
著名的 C 語(yǔ)言庫(kù) libxml 和 libxslt 的 Python 封裝。
功能很強(qiáng),支持 XPath 1.0、XSLT 1.0、擴(kuò)展 EXSLT、等。還可以用來(lái)解析 HTML 格式。
8.2.2 HTML
HTMLParser
以回調(diào)方式解析 HTML/XHTML 文件內(nèi)容的標(biāo)準(zhǔn)庫(kù)。
8.3 處理圖片
Python Imaging Library (PIL)
這是一個(gè)很有名氣的 Python 圖像處理庫(kù),支持常見(jiàn)圖像文件格式(BMP、JPG、GIF、PNG、等),可以對(duì)圖像進(jìn)行各種常見(jiàn)操作(格式轉(zhuǎn)換、旋轉(zhuǎn)、縮放、剪切、等)。
代碼示例
# 旋轉(zhuǎn)某圖片并顯示 from PIL import Image im = Image.open('xxx.jpg') im = im.rotate(90) im.show()8.4 處理 PDF
pyfpdf
這是 FPDF 的 Python 移植庫(kù),用來(lái)生成 PDF 文檔。
支持的功能比較全(嵌入字體、嵌入圖片),文檔也比較詳細(xì)。
代碼示例
# 這是個(gè)簡(jiǎn)單 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')# 支持寫(xiě)入 HTML 語(yǔ)法。目前支持幾種常見(jiàn)的 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 目前已經(jīng)不繼續(xù)升級(jí)維護(hù)了。PyPDF2 是 pyPdf 的 fork 并繼續(xù)增加新功能。
除了可以提取文件屬性,還可以切分/合并文檔,加密/解密文檔。
PDFMiner
可以提取 PDF 文件屬性以及每頁(yè)的文本,支持把內(nèi)容輸出為 HTML 格式。
8.5 處理 Office 文檔
8.5.1 Word(doc、docx)
PyWin32
PyWin32 前面提到過(guò)。它可以基于 COM 操作 Office 文檔,包括 Word(本地需要安裝 Office)。
8.5.2 Excel(xls、xlsx)
pyExcelerator
該庫(kù)可以支持 Office Excel(97/2000/XP/2003)以及 OpenOffice Calc 的文檔。無(wú)需依賴(lài)外部軟件。
PyWin32
PyWin32 前面提到過(guò)。它可以基于 COM 操作 Office 文檔,包括 Excel(本地需要安裝 Office)。
8.5.3 Power Point(PPT、pptx)
python-pptx
該庫(kù)可以用來(lái)生成 pptx(Open XML Powerpoint)格式的文檔。
PyWin32
PyWin32 前面提到過(guò)。它可以基于 COM 操作 Office 文檔,包括 Excel(本地需要安裝 Office)。
8.6 處理 CHM
PyCHM
這是基于 chmlib 的 Python 封裝庫(kù)。可以提取 CHM 文件的屬性以及每個(gè)頁(yè)面的內(nèi)容。
8.7 處理 RTF
PyRTF
這個(gè) Python 庫(kù)可以用來(lái)處理 RTF(富文本格式)文檔。
9 游戲開(kāi)發(fā)
PyGame
跨平臺(tái)的 Python 第三方庫(kù),用來(lái)輔助游戲開(kāi)發(fā)的,名氣非常大。
PyOpenGL
封裝 OpenGL 的 Python 第三方庫(kù)。
Python-Ogre
封裝 OGRE(3D 渲染引擎)的 Python 第三方庫(kù)。
10 數(shù)值計(jì)算 / 科學(xué)計(jì)算
NumPy
NumPy 提供了功能強(qiáng)大、性能很高的數(shù)值數(shù)組,可以用來(lái)進(jìn)行各種數(shù)值計(jì)算(包括矩陣運(yùn)算)。
代碼示例
# 以下是傳統(tǒng) Python 寫(xiě)法,冗長(zhǎng)且速度較慢 a = range(10000000) b = range(10000000) c = [] for i in range(len(a)) : c.append(a[i] + b[i]) # 以下是 NumPy 的寫(xiě)法,簡(jiǎn)潔且速度飛快 import numpy as np a = np.arange(10000000) b = np.arange(10000000) c = a + bSciPy
SciPy 依賴(lài) NumPy 提供的多維數(shù)組。相比 NumPy,SciPy 提供了更高層的數(shù)學(xué)運(yùn)算模塊(統(tǒng)計(jì)、線性代數(shù)、積分、常微分方程求解、傅立葉變換、信號(hào)處理、等),被廣泛用于科研和工程領(lǐng)域。
11 其它
一些不方便歸類(lèi)的,暫時(shí)放到這里。
PyPy
這是一個(gè)用 Python 寫(xiě)的 Python 解釋器(有點(diǎn)繞口令)。
PyPy 支持 JIT(Just-in-time compilation)和沙箱技術(shù),可做到比 CPython 更快的運(yùn)行速度。
新聞熱點(diǎn)
疑難解答
圖片精選