python實用庫

參考:https://github.com/programthink/opensource/blob/master/libs/python.wiki#35_html

 

 

Python 開源庫及示例代碼

 

 

Table of Contents

 

 

說明

本頁面彙總俺收集的各類 Python 代碼庫,不按期更新。前端

本頁面列出的各類 Python 庫/模塊,若是註明了官網的網址,說明這個庫是第三方的;不然就是 Python 語言內置的標準庫。node

若是你發現本頁面的開源庫有錯漏之處,很是歡迎給俺提供反饋——有 GitHub 賬號的同窗,能夠給俺發 issue;沒賬號的同窗,能夠去俺博客留言。python

 


 

1 算法

1.1 字符串

1.1.1 正則表達式

 

re

 

【標準庫】mysql

提供基於正則的匹配和替換。react

1.1.2 字符集

 

chardet

 

Home:https://github.com/erikrose/chardetlinux

chardet 能夠猜想任意一段文本的字符集編碼。對於編碼類型未知的文本,它會頗有用。ios

chardet 既能夠做爲模塊來使用,也能夠做爲命令行工具來使用。git

代碼示例程序員

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 是一組編碼算法的總稱。用於把二進制數據編碼爲文本。

 

base64

 

【標準庫】

提供 Base1六、Base3二、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

 

Home:http://www.jython.org/

Links:Wikipedia 維基百科

經過 Jython 可讓 Python 代碼運行在 JVM 上,而且能夠調用其它的 JVM 語言的代碼(好比 Java、Scala)

2.3 整合 dotNet 平臺

 

IronPython

 

Home:http://ironpython.net/

Links:Wikipedia 維基百科

經過 IronPython 可讓 Python 代碼運行在 dotNET 平臺上,而且能夠調用其它的 dotNET 語言的代碼(C#、F#、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()

 

sh

 

Home:https://github.com/amoffat/sh

這個項目能夠用來取代標準庫中的 subprocess;同時兼容 Python2 和 Python3。

使用它能夠寫出比 subprocess 更簡潔、更優雅的代碼。

代碼示例——獲取命令輸出

from sh import ifconfig print(ifconfig("wlan0"))

 

代碼示例——命令行參數

from sh import curl # 傳統風格 curl("https://program-think.blogspot.com/", "-o", "test.html", "--silent") # 命名參數風格 curl("https://program-think.blogspot.com/", o="test.html", silent=True)

 

代碼示例——管道

from sh import ls, wc print(wc(ls("/etc", "-1"), "-l"))

 

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 操做硬件

 

keyboard

 

Home:https://github.com/boppreh/keyboard

顧名思義,這個庫讓你能夠進行各類鍵盤相關的操做,包括:模擬按鍵、鍵盤鉤子(hook),按鍵記錄及重放。

支持複雜的組合鍵。純 python 代碼代碼,同時支持 Windows 和 Linux。

代碼示例

import keyboard

# 模擬按鍵。 keyboard.press_and_release("shift+s, space") # 模擬按鍵,並執行相應代碼。 keyboard.add_hotkey("page up, page down", lambda: keyboard.write("xxxx")) # 等待特定按鍵,而後繼續執行。 keyboard.wait("esc") # 記錄按鍵,直到用戶按了 ESC;而後以3倍速重放剛纔記錄的按鍵。 recorded = keyboard.record(until="esc") keyboard.play(recorded, speed_factor=3)

3.6 獲取系統信息

 

sys

 

【標準庫】

這個模塊可供訪問由解釋器使用或維護的變量和與解釋器進行交互的函數。

代碼示例

sys.argv     # 命令行參數 List,第一個元素是程序自己路徑 sys.exit(0) # 退出程序,正常退出時用 0 表示退出碼 sys.version # 獲取 Python 解釋程序的版本信息

 

 

platform

 

【標準庫】

這個模塊提供了不少用於獲取操做系統的信息的功能。

代碼示例

import platform

platform.platform()      # 獲取操做系統名稱及版本號,例如:"Windows-7-6.1.7601-SP1" platform.version() # 獲取操做系統版本號,例如:"6.1.7601" platform.architecture() # 獲取操做系統的架構,例如:("32bit", "WindowsPE")

 

psutil

 

Home:https://github.com/giampaolo/psutil

psutil(Python system and process utilities)是一個跨平臺的進程管理和系統工具庫,能夠處理」CPU、內存、磁盤、網絡、用戶「等信息。

主要用於系統資源的監控,分析,以及對進程進行必定的管理。

代碼示例

import psutil

psutil.cpu_count()       # 獲取 CPU 數量 psutil.cpu_freq() # 獲取 CPU 頻率 psutil.virtual_memory() # 獲取內存信息 psutil.swap_memory() # 獲取交換分區(換頁文件)信息 psutil.disk_partitions() # 獲取分區信息 psutil.disk_usage('/') # 獲取某分區的使用狀況 psutil.users() # 獲取用戶信息 p = psutil.Process(pid) # 根據給定的 pid 得到進程對象 p.name() # 進程名 p.exe() # 可執行程序的全路徑 p.cwd() # 進程的當前目錄 p.cmdline() # 啓動進程的命令行參數

3.7 Linux & Unix 系統相關

 

syslog

 

【標準庫】

經過它能夠很方便地跟 POSIX 的 syslog 服務進行交互。

3.8 Windows 系統相關

 

PyWin32

 

Home:http://python.net/crew/mhammond/win32/

這個第三方庫封裝了 Windows API 及 COM API。經過它能夠方便地用 Python 進行 Windows 編程(調用 COM 組件、編寫 Windows 服務、等)。

3.9 程序打包

 

PyInstaller

 

Home:http://www.pyinstaller.org/

PyInstaller 能夠把你的 Python 代碼製做成獨立運行的程序(不依賴 Python 環境就能夠運行)。

該工具支持多種操做系統,包括:Windows、Linux、Mac OS X、Solaris、AIX、等。

 

py2exe

 

Home:http://www.py2exe.org/

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/

Links:Wikipedia 維基百科

在 Python 社區,Django 是目前最有影響力的 Web 開發框架。該框架很重型,內置了 Web 服務端開發經常使用的組件(好比:ORM、用戶管理)。

Django 應用範圍很廣,好比 Google 的 Web 開發平臺 GAE 就支持它。

並且它徹底支持前面提到的 Jython 運行環境,能夠運行在任何 J2EE 服務器上。

 

TurboGears

 

Home:http://www.turbogears.org/

Links:Wikipedia 維基百科

又一個重型的 Web 開發框架,名氣僅次於 Django。

它跟 Django 同樣,都是「Full-Stack Frameworks」。

 

CherryPy

 

Home:http://www.cherrypy.org/

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()

 

Flask

 

Home:http://flask.pocoo.org/

Links:維基百科

輕量級 Web 應用框架。基於 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。

代碼示例——Hello world

from flask import Flask app = Flask(__name__) app.route("/") def hello_world() : return 「Hello World!" if __name__ == "__main__" : app.run()

 

Tornado

 

Home:http://www.tornadoweb.org/

Links:維基百科

一樣也是輕量級的 Web 框架,相似 Web.py。提供異步非阻塞 IO 的處理方式使其擁有較爲出色的抗負載能力。

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 WebSocket

(關於 WebSocket 的介紹,能夠參見維基百科的「這個連接」)

pywebsocket

 

Home:https://github.com/google/pywebsocket

這是 Google 提供的 WebSocket【服務端】。

該項目包含一個可獨立運行的 server 以及一個 Apache 擴展模塊(mod_pywebsocket)。

 

AutobahnPython

 

Home:https://github.com/crossbario/autobahn-python

這是 Autobahn 項目的子項目,同時提供了 WebSocket 的「服務端 & 客戶端」。

它兼容 Python2 和 Python3,另外還兼容 PyPy 和 Jython。

網絡方面,它能夠跟「asyncio 標準庫」以及「Twisted」整合。

除了實現 WebSocket 協議,它還完整實現了 WAMP(Web Application Messaging Protocol)。

代碼示例——Echo Server

from autobahn.twisted.websocket import WebSocketServerProtocol class MyServerProtocol(WebSocketServerProtocol) : def onConnect(self, request) : print("Client connecting: {}".format(request.peer)) def onOpen(self) : print("WebSocket connection open.") def onMessage(self, payload, isBinary) : if isBinary : print("Binary message received: {} bytes".format(len(payload))) else: print("Text message received: {}".format(payload.decode("utf8"))) self.sendMessage(payload, isBinary) def onClose(self, wasClean, code, reason) : print("WebSocket connection closed: {}".format(reason))

 

ws4py

 

Home:https://github.com/Lawouach/WebSocket-for-Python

此項目同時提供了 WebSocket 的「服務端 & 客戶端」;並同時兼容 Python2 和 Python3。

其【服務端】能夠跟「CherryPy、gevent、wsgiref、asyncio」整合;其【客戶端】能夠跟「Tornado、gevent」整合。

4.7 (其它)

 

selenium

 

Home:http://www.seleniumhq.org/

selenium 是一個很是優秀的框架,用於爬蟲和 Web 自動化測試。

代碼示例——模擬登陸

from selenium import webdriver driver = webdriver.Chrome() driver.get("http://192.168.1.1") driver.find_element_by_xpath('//*[@id="lgPwd"]').send_keys("123456") driver.find_element_by_xpath('//*[@id="loginSub"]').click() driver.quit()

 

scrapy

 

Home:https://scrapy.org/

Links:Wikipedia

Scrapy 是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。

能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。

 


 

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)協議

 

yagmail

 

Home:https://github.com/kootenpv/yagmail

一個很是簡單易用的用來發送郵件的第三方庫。

代碼示例

import yagmail

yag = yagmail.SMTP("my_gmail_username", "my_gmail_password") contents = ["This is the body, and here is just text http://somedomain/image.png", "You can find an audio file attached.', '/local/path/song.mp3"] yag.send("to@someone.com", "subject", contents)

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 封裝的第三方庫。

 

pyTelegramBotAPI

 

Home:https://github.com/eternnoir/pyTelegramBotAPI

一個簡單、易用的 TelegramBot 封裝。

 

Telethon

 

Home:https://github.com/LonamiWebs/Telethon

純 Python3 的 Telegram 客戶端封裝。

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 庫

 

paramiko

 

Home:http://www.paramiko.org/

paramiko 是用 python 語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的鏈接。

除了 SSH 協議以外,paramiko 還支持SFTP。

代碼示例

import paramiko

ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("IP", port, "username", "password")

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

 

Home:http://www.gevent.org/

這是一個基於協程的網絡庫,原先其底層依賴於 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 & 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

 

Home:http://www.pygresql.org/

操做 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/

Links:Wikipedia 維基百科

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

 

Home:http://sqlobject.org/

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

 

Home:http://www.wxpython.org/

Links:Wikipedia 維基百科

在全部的 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

 

Home:http://www.pygtk.org/

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/

Links:Wikipedia 維基百科

這是 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

 

Home:http://www.pyside.org/

這也是 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

 

Home:http://matplotlib.org/

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維圖表。效果圖在「這裏」。

 

Plotly

 

Home:https://plot.ly/

plotly 是現代平臺的敏捷商業智能和數據科學庫。

它做爲一款開源的繪圖庫,能夠應用於 Python、R、MATLAB、Excel、JavaScript、jupyter 等多種語言。

 


 

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 等)、散列算法(MD五、SHA一、RIPEMD 等)。

 

pyOpenSSL

 

Home:http://pyopenssl.sourceforge.net/

OpenSSL 在加密領域但是大名鼎鼎。這個庫使用 Python 對 OpenSSL 進行很薄的封裝。

 

Keyczar

 

Home:https://github.com/google/keyczar

這是 Google 提供的加密庫,同時提供 C++、Java、Python 三種語言的實現。

它提供了比較高層的 API, 使用者無需關心太多的細節。

 

passlib

 

Home:https://bitbucket.org/ecollins/passlib/

passlib 是一個久經考驗的很是成熟的跨平臺的散列函數庫,它所提供的功能包括隨機鹽密碼的生成與驗證,兩步驗證等。

代碼示例——驗證隨機鹽密碼

>>> # import the hash algorithm >>> from passlib.hash import pbkdf2_sha256 >>> # generate new salt, and hash a password >>> hash = pbkdf2_sha256.hash("toomanysecrets") >>> hash '$pbkdf2-sha256$29000$N2YMIWQsBWBMae09x1jrPQ$1t8iyB2A.WF/Z5JZv.lfCIhXXN33N23OSgQYThBYRfk' >>> # verifying the password >>> pbkdf2_sha256.verify("toomanysecrets", hash) True >>> pbkdf2_sha256.verify("joshua", hash) False

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 文件內容。

 

beautifulsoup

 

Home:https://www.crummy.com/software/BeautifulSoup/

Links:維基百科

Beautiful Soup 能夠從 HTML 或 XML 文件中提取數據。

它是寫」爬蟲「的利器,一般與 requests 或 selenium 配合。

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

 

Home:http://docs.wand-py.org/

它經過前面提到 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

 

Home:http://www.pygame.org/

Links:Wikipedia 維基百科

這是名氣很大的跨平臺遊戲引擎,構建於 SDL(Simple DirectMedia Layer)之上。

它起先是用來替代終止開發的 pySDL,包含了圖像和音頻的庫。

 

Cocos2d

 

Home:http://cocos2d.org/

它是一個開源的 2D 遊戲框架,最初使用 Python 編寫的。後來該框架已經被移植到了多種語言和平臺上。

其功能包括了:GUI 組件、音效、物理引擎、腳本語言綁定、場景編輯器 ...

不少手機遊戲是基於 Cocos2d 的衍生框架開發的。

 

Blender Game Engine

 

Home:http://www.blender.org/

Links:Wikipedia 維基百科

它是 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

 

Home:http://www.numpy.org/

Links:Wikipedia 維基百科

它提供了功能強大、性能很高的數值數組,能夠用來進行各類數值計算(包括矩陣運算)。

代碼示例

# 如下是傳統 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

 

Home:http://www.scipy.org/

Links:Wikipedia 維基百科

它依賴 NumPy 提供的多維數組。相比 NumPy,它提供了更高層的數學運算模塊(統計、線性代數、積分、常微分方程求解、傅立葉變換、信號處理 ...)。

它被普遍用於科研和工程領域。

 

SymPy

 

Home:http://sympy.org/

Links:Wikipedia 維基百科

它是用來作符號計算的,其目標是成爲一個全功能的「計算機代數系統」。

它支持的功能包括:符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散數學、幾何學、機率與統計 ......

 


 

13 (其它)

一些不方便歸類的,暫時放到這裏。

 

PyPy

 

Home:http://www.pypy.org/

Links:Wikipedia 維基百科

它是一個用 Python 寫的 Python 解釋器(有點繞口令)。

PyPy 支持 JIT(Just-in-time compilation)和沙箱技術,可作到【比 CPython 更快的運行速度】。

相關文章
相關標籤/搜索