正则表达式
Python 通过标准库的 re 模块来支持正则表达式(RE)。
搜索 and 匹配:“模式匹配(patten-mactching)”
搜索(searching):在字符串任意部分中搜索匹配的模式
匹配(matching):判断一个字符串能否从起始处全部或部分的匹配某个模式
正则表达式中常见的符号和字符
反斜杠(\)表示对特殊字符进行转译
正则表达式本身默认是贪心的,解决办法就是用“非贪婪”操作符“?”。这个操作符可以用在“*”、“+”或者“?”的后面,它的作用是要求正则表达式引擎匹配的字符越少越好。
网络编程
客户端/服务器架构
客户端/服务器网络编程:
在完成服务之前,服务器必需要先完成一些设置。先要创建一个通讯端点,让服务器能够“监听”请求。当服务器准备好之后,要通知客户端,否则客户端不会提出请求。客户端比较简单,只要创建一个通信端点,建立到服务器的连接,然后提出请求。一旦请求处理完成,客户端收到了结果,通信就完成了。
套接字:通信端点
套接字是一种具有“通信端点”概念的计算机网络数据结构。
网络化的应用程序在开始任何通讯前都必需创建套接字。没有它将没办法通信。
套接字有两种,分别是基于文件型的和基于网络型的。
AF_UNIX:“地址家族:UNIX”,基于文件
AF_INET:“地址家族:Internet”,基于网络
Python 只支持 AF_UNIX,AF_INET 和 AF_NETLINK 家族
面向连接/面向无连接:
面向连接:“虚电路”或者“流套接字”,TCP,套接字类型为 SOCK_STREAM
面向无连接:UDP,套接字类型为 SOCK_DGRAM (datagram 数据报)
创建套接字语法:
from socket import *
TCP 套接字:tcpSock = socket(AF_INET, SOCK_STREAM)
UDP 套接字:udpSock = socket(AF_INET, SOCK_DGRAM)
套接字对象的常用函数
网络客户端编程
把因特网比作是一个数据交换中心,数据交换的参与者是一个服务提供者和一个服务的使用者,有人把它比作“生产者 – 消费者”,一般是一个生产者对多个消费者。
文件传输网际协议:
FTP:文件传输协议(File Transfer Protocol)
UUCP:Unix-to-Unix 复制协议(Unix-to-Unix Copy Protocol)
HTTP:超文本传输协议(Hypertext Transfer Protocol)
rcp/scp/rsync:Unix 下的远程文件复制指令
一般编程步骤:
连接到服务器
登陆(如果需要的话)
发出服务请求(有可能有返回信息)
退出
Python 和 FTP:from ftplib import FTP
Python 和 NNTP:from nntplib import NNTP
Python 和 SMTP:from smtplib import SMTP
多线程编程
Python 代码的执行由 Python 虚拟机(也叫解释器主循环)来控制。
虽然 Python 解释器中可以“运行”多个程序,但在任意时刻,只有一个线程在解释器中运行。与单个 CPU 的多线程原理是一样的。
对 Python 虚拟机的访问由全局解释器锁(GIL)来控制的,也正是这个锁保证了同一时刻只有一个线程在运行。
不建议使用 thread 模块,而推荐使用 threading 模块,原因:
Thread 模块不支持守护进程。在主线程退出的时候,所有他其他线程没有被清除就退出了
Threading 模块支持守护进程。能保证所有“重要的”子线程都退出后,进程才会结束
Threading 模块更为先进,对线程的支持更为完善
Thread 模块中的属性可能与 threading 出现冲突
低级别的 Thread 模块的同步原语只有一个,而 Threading 则有很多
time.sleep(secs):睡眠多长时间,secs 单位秒(不是毫秒)
start_new_thread(function, args keargs=None) 产生一个新的线程,在新线程中用指定的参数和可选的 kwargs 来调用这个函数
Threading 的 Thread 类是我们主要的运行对象。它有很多 Thread 模块中没有的函数。
注:thread.start()前调用 thread.setDaemon(True)表示这个线程“不重要”
图形用户界面编程
GUI:graphical user interface
Python 的默认 GUI 工具集是 TK,我们可以通过 Python 接口 Tkinter 来使用 Tk。
import Tkinter 先测试一下系统有没有开启 Tkinter。
创建 GUI 程序的五个基本步骤:
- Import Tkinter
- 创建顶层窗口对象容纳你的 GUI: top = Tkinter.Tk()
- 在 top 中创建所有的 GUI 模块
- 将 3 中的 GUI 模块与底层代码相连接
- 进入主事件循环
A Tkinter example: “Hello world!” :
from Tkinter import * #导入 Tkinter
top = Tk() #顶层窗口
label = Label(top, text=’Hello world!’) #创建模块
label.pack() #装载连接
mainloop() #主事件循环
运行截图:
Python 拥有大量的图形工具集,其中 4 种比较流行的工具集:
Tix(Tk Interface eXtensions)
Pmw(Python MegaWidgets 的 Tkinter 扩展)
wxPython(wxWidgets 的 Python 绑定)
PyGTK(GTK+的 Python 绑定)
其中 Tix 模块包含在 Python 标准库中,其它工具集是第三方的,必须自己下载。
Learn more about Python GUI:
http://wiki.python.org/moin/GuiProgramming
Web编程
urlparse 模块:
Urllib 模块:
Urllib 模块提供了所有你需要的功能,它提供了一个高级的 Web 交流库。其特殊功能在于利用各种协议(HTTP、FTP 等)从网络上下载数据。
urllib.open()
语法:urlopen(urlstr, postQueryData=None)
作用:打开 urlstr 所指向的 URL
结果:成功则返回一个文件类型对象
urllib.urlretrieve()
语法:urlretrieve(urlstr, localfile=None, downloadSta-tusHook=None)
作用:将 urlstr 定位到的整个 HTML 文件下载到本地硬盘
结果:返回一个二元组(filename,mine_hdrs)本地文件名、MIME 文件头
Python 的基本 Web 客户端一般用于在 Web 上查询或下载文件。而其高级 Web 客户端可以在 internet 上完成基于不同目的的所有和下载页面,包括:
为 Google 和 Yahoo 的搜索引擎建索引
脱机浏览—将文档下载到本地,重新设定超链接,为本地浏览器创建镜像
下载并保持历史记录或框架
Web 页的缓存,节省再次访问 Web 站点的下载时间
高级 Web 客户端的一个例子就是“网络爬虫”(也称蜘蛛或机器人),与正则表达式的完美结合使用,使你在 internet 上想“爬”什么就“爬”什么。
CGI:帮助 Web 服务器处理客户端数据
Web 服务器接收到表单反馈,与外部应用程序交互,收到并返回新的生成的 HTML 页面都发生在 Web 服务器的 CGI(标准网关接口,Common Gateway Interface)接口上。
CGI 其实只是一个适用于小型 Web 网站开发的工具。
FieldStorge 类:Python CGI 脚本开始时被实例化,包含一个类似字典的对象,键—表单栏目的名字,值—栏目相应的数据。
建立 Python 自带的 Web 服务器:
命令:$ Python –m CGIHTTPServer
端口:8000
目录:在目录下手工建立 Cgi-bin 存放.py CGI 脚本
访问:http://localhost:8000/ex.html
http://localhost:8000/cgi-bin/ex.py
用 Python 建立 Web 服务器:
要建立一个 Web 服务,一个基本的服务器和一个“处理器”是必备的。
基本的服务器:在客户端和服务器端完成必要的 HTTP 交互。
处理器:处理 Web 服务的简单软件。处理客户端请求,并返回适当的文件。
Web 服务器模块和类
模块 | 描述 |
---|---|
BaseHTTPServer | 提供基本的 Web 服务和处理器类,分别是 HTTPServer 和 BaseHTTPRequestHandler |
SimpleHTTPServer | 包含执行 GET 和 HEAD 请求的 SimpleHTTPRequestHandle 类 |
CGIHTTPServer | 包含处理 POST 请求和执行 CGIHTTPRequestHandle 类 |
数据库编程
Python 数据库 API:Python 能够直接通过数据库接口,也可以通过 ORM(需要自己书写 SQL) 来访问关系数据库
Python 应用程序(嵌入 SQL)-- Python DB 接口程序 — RDBMS 客户端库 — 关系数据库
DB-API:这是一个规范。它定义了一系列必需的对象和数据库存取方式,以便在各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。
DB-API 模块属性
属性名 | 描述 |
---|---|
apilevel | 模块兼容的 DB-API 版本号 |
threadsafety | 线程安全级别 |
paramstyle | 该模块支持的 SQL 语句参考风格 |
connect() | 连接函数 |
连接对象: 要与数据库通信,必须先和数据库建立连接。连接对象用于处理将命令送往服务器,以及从服务器接受数据等基本功能。
游标对象: 允许用于执行数据库命令和得到查询结果。
对于不支持游标的数据库来说,connect 对象的 cursor()方法仍然会返回一个尽量模仿游标对象的对象。
游标对象最重要的属性是 execute*()和 fetch*(),所有对数据库服务器的请求均由它们来完成。
Python 到底支持哪些平台下的数据库?答案是几乎所有!
以 MySQL 举例:
>>> import MySQLdb
>>> cxn = MySQLdb.connect(user=’rooot’)
>>> cxn.query(‘CREATE DATABASE test’)
>>> cxn.commit()
>>> cxn.close()
-----------------
>>> cxn = MySQLdb.connect(db=’test’)
>>> cur = cxn.cursor()
>>> cur.execute(‘CREATE TABLE users(login VARCHAR(8), uid INT)’)
//0L
>>> cur.execute(‘INSERT INTO users VALUES(‘john’, 7000)’)
//1L
>>> for data in cur.fetcharall():
print ‘%s\t%s’ % data
john 7000
>>> cur.close()
>>> cxn.commit()
>>> cxn.close()
ORM:对象-关系管理器
考虑对象,而不是 SQL
Python 和 ORM:最著名的 Python ORM 模块是 SQLAlchemy 和 SQLObject