正则表达式的标准库。
以读写文件的方式来操作字符串(有点类似于内存文件)。
cStringIO 是 C 语言实现的,提供高性能;而 StringIO 是 Python 实现的,提供 Unicode 兼容性。
chardet 可以猜测任意一段文本的字符集编码。对于编码类型未知的文本,它会很有用。
chardet 既可以作为模块来使用,也可以作为命令行工具来使用。
代码示例
import chardet print chardet.detect(bytes)
这个标准库顾名思义,封装了常用的数学函数(开方、指数、对数、三角函数、等)
这个标准库顾名思义,是用来进行随机数生成的
代码示例
# 生成 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、等)、散列算法(MD5、SHA1、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]}]
标准库,提供 Base16、Base32、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 更快的运行速度。