首页 > 代码库 > python 各模块学习

python 各模块学习

 

核心模块

 

  • 1.1. 介绍
  • 1.2. _ _builtin_ _ 模块
  • 1.3. exceptions 模块
  • 1.4. os 模块
  • 1.5. os.path 模块
  • 1.6. stat 模块
  • 1.7. string 模块
  • 1.8. re 模块
  • 1.9. math 模块
  • 1.10. cmath 模块
  • 1.11. operator 模块
  • 1.12. copy 模块
  • 1.13. sys 模块
  • 1.14. atexit 模块
  • 1.15. time 模块
  • 1.16. types 模块
  • 1.17. gc 模块

 

更多标准模块

 

  • 2.1. 概览
  • 2.2. fileinput 模块
  • 2.3. shutil 模块
  • 2.4. tempfile 模块
  • 2.5. StringIO 模块
  • 2.6. cStringIO 模块
  • 2.7. mmap 模块
  • 2.8. UserDict 模块
  • 2.9. UserList 模块
  • 2.10. UserString 模块
  • 2.11. traceback 模块
  • 2.12. errno 模块
  • 2.13. getopt 模块
  • 2.14. getpass 模块
  • 2.15. glob 模块
  • 2.16. fnmatch 模块
  • 2.17. random 模块
  • 2.18. whrandom 模块
  • 2.19. md5 模块
  • 2.20. sha 模块
  • 2.21. crypt 模块
  • 2.22. rotor 模块
  • 2.23. zlib 模块
  • 2.24. code 模块

 

线程和进程

 

  • 3.1. 概览
  • 3.2. threading 模块
  • 3.3. Queue 模块
  • 3.4. thread 模块
  • 3.5. commands 模块
  • 3.6. pipes 模块
  • 3.7. popen2 模块
  • 3.8. signal 模块

 

数据表示

 

  • 4.1. 概览
  • 4.2. array 模块
  • 4.3. struct 模块
  • 4.4. xdrlib 模块
  • 4.5. marshal 模块
  • 4.6. pickle 模块
  • 4.7. cPickle 模块
  • 4.8. copy_reg 模块
  • 4.9. pprint 模块
  • 4.10. repr 模块
  • 4.11. base64 模块
  • 4.12. binhex 模块
  • 4.13. quopri 模块
  • 4.14. uu 模块
  • 4.15. binascii 模块

 

文件格式

 

  • 5.1. 概览
  • 5.2. xmllib 模块
  • 5.3. xml.parsers.expat 模块
  • 5.4. sgmllib 模块
  • 5.5. htmllib 模块
  • 5.6. htmlentitydefs 模块
  • 5.7. formatter 模块
  • 5.8. ConfigParser 模块
  • 5.9. netrc 模块
  • 5.10. shlex 模块
  • 5.11. zipfile 模块
  • 5.12. gzip 模块

 

邮件和新闻消息处理

 

  • 6.1. 概览
  • 6.2. rfc822 模块
  • 6.3. mimetools 模块
  • 6.4. MimeWriter 模块
  • 6.5. mailbox 模块
  • 6.6. mailcap 模块
  • 6.7. mimetypes 模块
  • 6.8. packmail 模块
  • 6.9. mimify 模块
  • 6.10. multifile 模块

 

网络协议

 

  • 7.1. 概览
  • 7.2. socket 模块
  • 7.3. select 模块
  • 7.4. asyncore 模块
  • 7.5. asynchat 模块
  • 7.6. urllib 模块
  • 7.7. urlparse 模块
  • 7.8. cookie 模块
  • 7.9. robotparser 模块
  • 7.10. ftplib 模块
  • 7.11. gopherlib 模块
  • 7.12. httplib 模块
  • 7.13. poplib 模块
  • 7.14. imaplib 模块
  • 7.15. smtplib 模块
  • 7.16. telnetlib 模块
  • 7.17. nntplib 模块
  • 7.18. SocketServer 模块
  • 7.19. BaseHTTPServer 模块
  • 7.20. SimpleHTTPServer 模块
  • 7.21. CGIHTTPServer 模块
  • 7.22. cgi 模块
  • 7.23. webbrowser 模块

 

国际化

 

  • 8.1. locale 模块
  • 8.2. unicodedata 模块
  • 8.3. ucnhash 模块

 

多媒体相关模块

 

  • 9.1. 概览
  • 9.2. imghdr 模块
  • 9.3. sndhdr 模块
  • 9.4. whatsound 模块
  • 9.5. aifc 模块
  • 9.6. sunau 模块
  • 9.7. sunaudio 模块
  • 9.8. wave 模块
  • 9.9. audiodev 模块
  • 9.10. winsound 模块

 

数据储存

 

  • 10.1. 概览
  • 10.2. anydbm 模块
  • 10.3. whichdb 模块
  • 10.4. shelve 模块
  • 10.5. dbhash 模块
  • 10.6. dbm 模块
  • 10.7. dumbdbm 模块
  • 10.8. gdbm 模块

 

工具和实用程序

 

  • 11.1. dis 模块
  • 11.2. pdb 模块
  • 11.3. bdb 模块
  • 11.4. profile 模块
  • 11.5. pstats 模块
  • 11.6. tabnanny 模块

 

其他模块

 

  • 12.1. 概览
  • 12.2. fcntl 模块
  • 12.3. pwd 模块
  • 12.4. grp 模块
  • 12.5. nis 模块
  • 12.6. curses 模块
  • 12.7. termios 模块
  • 12.8. tty 模块
  • 12.9. resource 模块
  • 12.10. syslog 模块
  • 12.11. msvcrt 模块
  • 12.12. nt 模块
  • 12.13. _winreg 模块
  • 12.14. posix 模块

 

执行支持模块

 

  • 13.1. dospath 模块
  • 13.2. macpath 模块
  • 13.3. ntpath 模块
  • 13.4. posixpath 模块
  • 13.5. strop 模块
  • 13.6. imp 模块
  • 13.7. new 模块
  • 13.8. pre 模块
  • 13.9. sre 模块
  • 13.10. py_compile 模块
  • 13.11. compileall 模块
  • 13.12. ihooks 模块
  • 13.13. linecache 模块
  • 13.14. macurl2path 模块
  • 13.15. nturl2path 模块
  • 13.16. tokenize 模块
  • 13.17. keyword 模块
  • 13.18. parser 模块
  • 13.19. symbol 模块
  • 13.20. token 模块

 

其他模块

 

  • 14.1. 概览
  • 14.2. pyclbr 模块
  • 14.3. filecmp 模块
  • 14.4. cmd 模块
  • 14.5. rexec 模块
  • 14.6. Bastion 模块
  • 14.7. readline 模块
  • 14.8. rlcompleter 模块
  • 14.9. statvfs 模块
  • 14.10. calendar 模块
  • 14.11. sched 模块
  • 14.12. statcache 模块
  • 14.13. grep 模块
  • 14.14. dircache 模块
  • 14.15. dircmp 模块
  • 14.16. cmp 模块
  • 14.17. cmpcache 模块
  • 14.18. util 模块
  • 14.19. soundex 模块
  • 14.20. timing 模块
  • 14.21. posixfile 模块
  • 14.22. bisect 模块
  • 14.23. knee 模块
  • 14.24. tzparse 模块
  • 14.25. regex 模块
  • 14.26. regsub 模块
  • 14.27. reconvert 模块
  • 14.28. regex_syntax 模块
  • 14.29. find 模块

 

  1. Py 2.0 后新增模块
  2. 后记

 

1. 核心模块

1.1. 介绍

Python 的标准库包括了很多的模块从 Python 语言自身特定的类型和声明到一些只用于少数程序的不著名的模块.

1.1.1. 内建函数和异常

下面的这两个模块比其他模块加在一起还要重要定义内建函数(例如 len, int, range ...) _ _builtin_ _ 模块以及定义所有内建异常的 exceptions模块.

Python 在启动时导入这两个模块使任何程序都能够使用它们.

1.1.2. 操作系统接口模块

Python 有许多使用了 POSIX 标准 API 和标准 语言库的模块它们为底层操作系统提供了平台独立的接口.

这类的模块包括提供文件和进程处理功能的 os 模块提供平台独立的文件名处理 (分拆目录名文件名后缀等) os.path 模块以及时间日期处理相关的 time/datetime 模块.

[!Feather注: datetime 为 Py2.3 新增模块, 提供增强的时间处理方法 ]

延伸一点说网络和线程模块同样也可以归为这一个类型不过 Python 并没有在所有的平台/版本实现这些.

1.1.3. 类型支持模块

标准库里有许多用于支持内建类型操作的库. string 模块实现了常用的字符串处理math 模块提供了数学计算操作和常量(pi, e都属于这类常量), cmath模块为复数提供了和 math 一样的功能.

1.1.4. 正则表达式

re 模块为 Python 提供了正则表达式支持正则表达式是用于匹配字符串或特定子字符串的 有特定语法的字符串模式.

1.1.5. 语言支持模块

sys 模块可以让你访问解释器相关参数,比如模块搜索路径,解释器版本号等operator 模块提供了和内建操作符作用相同的函数copy 模块允许 你复制对象, Python 2.0 新加入的 gc 模块提供了对垃圾收集的相关控制功能.

 

1.2. _ _builtin_ _ 模块

这个模块包含 Python 中使用的内建函数一般不用手动导入这个模块; Python会帮你做好一切.

1.2.1. 使用元组或字典中的参数调用函数

Python允许你实时地创建函数参数列表只要把所有的参数放入一个元组中, 然后通过内建的 apply 函数调用函数

要想把关键字参数传递给一个函数你可以将一个字典作为 apply 函数的第 个参数

apply 函数的一个常见用法是把构造函数参数从子类传递到基类尤其是构造函数需要接受很多参数的时候

Python 2.0 提供了另个方法来做相同的事你只需要使用一个传统的函数调用 使用 来标记元组** 来标记字典.

下面两个语句是等价的:

result = function(*args, **kwargs) result = apply(function, args, kwargs)

1.2.2. 加载和重载模块

如果你写过较庞大的 Python 程序那么你就应该知道 import 语句是用来导入外部模块的 (当然也可以使用 from-import 版本). 不过你可能不知道import 其实是靠调用内建 函数 _ _import_ _ 来工作的.

通过这个戏法你可以动态地调用函数当你只知道模块名称(字符串)的时候这将很方便Example 1-4 展示了这种用法动态地导入所有以 "-plugin" 结尾的模块.

注意,当你重加载模块时它会被重新编译新的模块会代替模块字典里的老模块但是已经用原模块里的类建立的实例仍然使用的是老模块(不会被更新).

同样地使用 from-import 直接创建的到模块内容的引用也是不会被更新的.

1.2.3. 关于名称空间

dir 返回由给定模块实例或其他类型的所有成员组成的列表这可能在交互式 Python 解释器下很有用也可以用在其他地方. .

getmembers 函数返回了一个有序列表成员在列表中名称出现的越早它所处的类层次就越高如果无所谓顺序的话你可以使用字典代替列表.vars 函数与此相似它返回的是包含每个成员当前值的字典如果你使用不带参数的 vars , 它将返回当前局部名称空间的可见元素( locals() 函数 ). 

1.2.4. 检查对象类型

Python 是一种动态类型语言这意味着给一个定变量名可以在不同的场合绑定到不同的类型上在接下面例子中同样的函数分别被整数浮点数以及一个字符串调用:

你可以在 operator 模块中找到检查对象是否为某一内建类型(数字序列或者字典等的函数但是因为创建一个类很简单(比如实现基本序列方法的类), 所以对这些 类型使用显式的类型判断并不是好主意.

在处理类和实例的时候会复杂些. Python 不会把类作为本质上的类型对待相反地所有的类都属于一个特殊的类类型(special class type), 所有的类实例属于一个特殊的实例类型(special instance type).

这意味着你不能使用 type 函数来测试一个实例是否属于一个给定的类所有的实例都是同样 的类型为了解决这个问题你可以使用 isinstance 函数,它会检查一个对象是 不是给定类(或其子类)的实例

1.2.5. 计算 Python 表达式

Python 提供了在程序中与解释器交互的多种方法例如 eval 函数将一个字符串作为 Python 表达式求值你可以传递一串文本简单的表达式或者使用 内建 Python 函数

1.2.6. 编译和执行代码

eval 函数只针对简单的表达式如果要处理大块的代码你应该使用 compile  exec 函数 

1.2.7. 从 _ _builtin_ _ 模块重载函数

因为 Python 在检查局部名称空间和模块名称空间前不会检查内建函数所以有时候你可能要显式地引用 _ _builtin_ _ 模块例如 Example 1-25 重载了内建的 open 函数这时候要想使用原来的 open 函数就需要脚本显式地指明模块名称.

1.3. exceptions 模块

exceptions 模块提供了标准异常的层次结构. Python 启动的时候会自动导入这个模块并且将它加入到 _ _builtin_ _ 模块中也就是说一般不需要手动导入这个模块.

该模块定义了以下标准异常:

  • Exception 是所有异常的基类强烈建议(但不是必须)自定义的异常异常也继承这个类.
  • SystemExit(Exception)  sys.exit 函数引发如果它在最顶层没有被 try-except 语句捕获那么解释器将直接关闭而不会显示任何跟踪返回信息.
  • StandardError(Exception) 是所有内建异常的基类( SystemExit ).
  • KeyboardInterrupt(StandardError) 在用户按下 Control-C(或其他打断按键)后 被引发如果它可能会在你使用 "捕获所有 try-except 语句时导致奇怪的问题.
  • ImportError(StandardError) 在 Python 导入模块失败时被引发.
  • EnvironmentError 作为所有解释器环境引发异常的基类. (也就是说这些异常一般不是由于程序 bug 引起).
  • IOError(EnvironmentError) 用于标记 I/O 相关错误.
  • OSError(EnvironmentError) 用于标记 os 模块引起的错误.
  • WindowsError(OSError) 用于标记 os 模块中 Windows 相关错误.
  • NameError(StandardError) 在 Python 查找全局或局部名称失败时被引发.
  • UnboundLocalError(NameError) , 当一个局部变量还没有赋值就被使用时会引发这个异常这个异常只有在2.0及之后的版本有早期版本只会引发一个普通的 NameError .
  • AttributeError(StandardError) , 当 Python 寻找(或赋值)给一个实例属性方法模块功能或其它有效的命名失败时会引发这个异常.
  • SyntaxError(StandardError) , 当解释器在编译时遇到语法错误这个异常就被引发.
  • (2.0 及以后版本IndentationError(SyntaxError) 在遇到非法的缩进时被引发该异常只用于 2.0 及以后版本之前版本会引发一个 SyntaxError 异常.
  • (2.0 及以后版本TabError(IndentationError) , 当使用 -tt 选项检查不一致缩进时有可能被引发该异常只用于 2.0 及以后版本之前版本会引发一个SyntaxError 异常.
  • TypeError(StandardError) , 当给定类型的对象不支持一个操作时被引发.
  • AssertionError(StandardError)  assert 语句失败时被引发(即表达式为 false ).
  • LookupError(StandardError) 作为序列或字典没有包含给定索引或键时所引发异常的基类.
  • IndexError(LookupError) , 当序列对象使用给定索引数索引失败时(不存在索引对应对象)引发该异常.
  • KeyError(LookupError) 当字典对象使用给定索引索引失败时(不存在索引对应对象)引发该异常.
  • ArithmeticError(StandardError) 作为数学计算相关异常的基类.
  • OverflowError(ArithmeticError) 在操作溢出时被引发(例如当一个整数太大导致不能符合给定类型).
  • ZeroDivisionError(ArithmeticError) , 当你尝试用 除某个数时被引发.
  • FloatingPointError(ArithmeticError) , 当浮点数操作失败时被引发.
  • ValueError(StandardError) , 当一个参数类型正确但值不合法时被引发.
  • (2.0 及以后版本UnicodeError(ValueError) , Unicode 字符串类型相关异常只使用在 2.0 及以后版本.
  • RuntimeError(StandardError) , 当出现运行时问题时引发包括在限制模式下尝试访问外部内容未知的硬件问题等等.
  • NotImplementedError(RuntimeError) , 用于标记未实现的函数或无效的方法.
  • SystemError(StandardError) , 解释器内部错误该异常值会包含更多的细节 (经常会是一些深层次的东西比如 "eval_code2: NULL globals" ). 这本书的作者编了 年程序都没见过这个错误. (想必是没有用 raise SystemError).
  • MemoryError(StandardError) , 当解释器耗尽内存时会引发该异常注意只有在底层内存分配抱怨时这个异常才会发生如果是在你的旧机器上这个异常发生之前系统会陷入混乱的内存交换中.

你可以创建自己的异常类只需要继承内建的 Exception (或者它的任意一个合适的子类)即可有需要时可以再重载它的 _ _str_ _ 方法

1.4. os 模块

这个模块中的大部分函数通过对应平台相关模块实现比如 posix  nt. os 模块会在第一次导入的时候自动加载合适的执行模块.

1.4.1. 处理文件

内建的 open / file 函数用于创建打开和编辑文件 os 模块提供了重命名和删除文件所需的函数.

1.4.2. 处理目录

os 模块也包含了一些用于目录处理的函数.

listdir 函数返回给定目录中所有文件名(包括目录名)组成的列表而 Unix 和 Windows 中使用的当前目录和父目录标记(. 和 .. )不包含在此列表中.

makedirs  removedirs 函数用于创建或删除目录层,

removedirs 函数会删除所给路径中最后一个目录下所有的空目录 mkdir  rmdir 函数只能处理单个目录级

如果需要删除非空目录你可以使用 shutil 模块中的 rmtree 函数.

1.4.3. 处理文件属性

stat 函数可以用来获取一个存在文件的信息,. 它返回一个类元组对象(stat_result对象包含 10 个元素), 依次是st_mode (权限模式), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (所有者用户 ID), st_gid (所有者所在组 ID ), st_size (文件大小字节), st_atime (最近一次访问时间), st_mtime (最近修改时间), st_ctime (平台相关; Unix下的最近一次元数据/metadata修改时间或者 Windows 下的创建时间) - 以上项目也可作为属性访问.

stat 模块包含了很多可以处理该返回对象的常量及函数下面的代码展示了其中的一些.

可以使用 chmod  utime 函数修改文件的权限模式和时间属性

1.4.4. 处理进程

system 函数在当前进程下执行一个新命令并等待它完成,.

exec 函数会使用新进程替换当前进程(或者说是"转到进程").  Example 1-35 字符串 "goodbye" 永远不会被打印.

Python 提供了很多表现不同的 exec 函数Example 1-35 使用的是 execvp 函数它会从标准路径搜索执行程序把第二个参数(元组)作为单独的参数传递给程序并使用当前的环境变量来运行程序其他七个同类型函数请参阅 Python Library Reference .

在 Unix 环境下你可以通过组合使用 exec , fork 以及 wait 函数来从当前程序调用另一个程序fork 函数复制当前进程wait函数会等待一个子进程执行结束.

fork 函数在子进程返回中返回 0 (这个进程首先从 fork 返回值), 在父进程中返回一个非 的进程标识符(子进程的 PID ). 也就是说只有当我们处于子进程的时候 "not pid" 才为真.

fork  wait 函数在 Windows 上是不可用的但是你可以使用 spawn 函数, . 不过spawn 不会沿着路径搜索可执行文件你必须自己处理好这些.

spawn 函数还可用于在后台运行一个程序Example 1-38  run 函数添加了一个可选的 mode 参数当设置为 os.P_NOWAIT 这个脚本不会等待子程序结束默认值 os.P_WAIT  spawn 会等待子进程结束.

其它的标志常量还有 os.P_OVERLAY ,它使得 spawn 的行为和 exec 类似以及 os.P_DETACH , 它在后台运行子进程与当前控制台和键盘焦点隔离.

1.4.5. 处理守护进程(Daemon Processes)

Unix 系统中你可以使用 fork 函数把当前进程转入后台(一个"守护者/daemon"). 一般来说你需要派生(fork off)一个当前进程的副本然后终止原进程

os.setpgrp()

为了确保守护进程创建的文件能够获得程序指定的 mode flags(权限模式标记?), 最好删除 user mode mask:

os.umask(0)

然后你应该重定向 stdout/stderr 文件而不能只是简单地关闭它们(如果你的程序需要 stdout  stderr 写入内容的时候可能会出现意想不到的问题).

class NullDevice: def write(self, s): pass sys.stdin.close() sys.stdout = NullDevice() sys.stderr = NullDevice()

换言之由于 Python  print 和 中的 printf/fprintf 在设备(device) 没有连接后不会关闭你的程序此时守护进程中的 sys.stdout.write() 会抛出一个 IOError 异常而你的程序依然在后台运行的很好....

另外先前例子中的 _exit 函数会终止当前进程 sys.exit 不同如果调用者(caller) 捕获了 SystemExit 异常程序仍然会继续执行. .

 

1.5. os.path 模块

os.path 模块包含了各种处理长文件名(路径名)的函数先导入 (import) os 模块然后就可以以 os.path 访问该模块.

1.5.1. 处理文件名

os.path 模块包含了许多与平台无关的处理长文件名的函数也就是说你不需要处理前后斜杠冒号等.

注意这里的 split 只分割出最后一项(不带斜杠).

os.path 模块中还有许多函数允许你简单快速地获知文件名的一些特征

expanduser 函数以与大部分Unix shell相同的方式处理用户名快捷符号(~, 不过在 Windows 下工作不正常),

1.5.2. 搜索文件系统

walk 函数会帮你找出一个目录树下的所有文件 ( Example 1-46 所示). 它的参数依次是目录名回调函数以及传递给回调函数的数据对象.

walk 函数的接口多少有点晦涩 (也许只是对我个人而言我总是记不住参数的顺序). Example 1-47 中展示的 index 函数会返回一个文件名列表你可以直接使用 for-in 循环处理文件.

如果你不想列出所有的文件 (基于性能或者是内存的考虑) , Example 1-48 展示了另一种方法这里 DirectoryWalker 类的行为与序列对象相似一次返回一个文件. (generator?)

注意 DirectoryWalker 类并不检查传递给 _ _getitem_ _ 方法的索引值这意味着如果你越界访问序列成员(索引数字过大)的话这个类将不能正常工作.

最后如果你需要处理文件大小和时间戳Example 1-49 给出了一个类它返回文件名和它的 os.stat 属性(一个元组). 这个版本在每个文件上都能节省一次或两次 stat 调用os.path.isdir  os.path.islink 内部都使用了 stat ), 并且在一些平台上运行很快.

 

1.6. stat 模块

Example 1-50 展示了 stat 模块的基本用法这个模块包含了一些 os.stat 函数中可用的常量和测试函数.

 

1.7. string 模块

string 模块提供了一些用于处理字符串类型的函数.

大多数情况下 (特别是当你使用的是1.6及更高版本时,你可以使用 int  float 函数代替 string 模块中对应的函数。

atoi 函数可以接受可选的第二个参数指定数基(number base). 如果数基为 0, 那么函数将检查字符串的前几个字符来决定使用的数基如果为 "0x," 数基将为 16 (十六进制), 如果为 "0," 则数基为 8 (八进制). 默认数基值为 10 (十进制), 当你未传递参数时就使用这个值.

在 1.6 及以后版本中int 函数和 atoi 一样可以接受第二个参数与字符串版本函数不一样的是 int  float 可以接受 Unicode 字符串对象.

 

1.8. re 模块

re 模块提供了一系列功能强大的正则表达式 (regular expression) 工具它们允许你快速检查给定字符串是否与给定的模式匹配 (使用 match 函数), 或者包含这个模式 (使用 search 函数). 正则表达式是以紧凑(也很神秘)的语法写出的字符串模式.

match 尝试从字符串的起始匹配一个模式, . 如果模式匹配了某些内容 (包括空字符串如果模式允许的话) , 它将返回一个匹配对象使用它的 group 方法可以找出匹配的内容.

search 函数会在字符串内查找模式匹配,. 它在所有可能的字符位置尝试匹配模式从最左边开始一旦找到匹配就返回一个匹配对象如果没有找到相应的匹配就返回 None .

你也可以通过回调 (callback) 函数使用 sub 来替换指定模式

 

1.9. math 模块

math 模块实现了许多对浮点数的数学运算函数这些函数一般是对平台 库中同名函数的简单封装所以一般情况下不同平台下计算的结果可能稍微地有所不同有时候甚至有很大出入

 

1.10. cmath 模块

cmath 模块包含了一些用于复数运算的函数.

 

1.11. operator 模块

operator 模块为 Python 提供了一个 "功能性的标准操作符接口当使用 map 以及 filter 一类的函数的时候operator 模块中的函数可以替换一些lambda 函式而且这些函数在一些喜欢写晦涩代码的程序员中很流行

这里需要注意 operator 模块使用非常规的方法处理对象实例所以使用 isNumberType , isMappingType , 以及 isSequenceType 函数的时候要小心这很容易降低代码的扩展性.

同样需要注意的是一个字符串序列成员 (单个字符也是序列所以当在递归函数使用 isSequenceType 来截断对象树的时候别把普通字符串作为参数(或者是任何包含字符串的序列对象).

 

1.12. copy 模块

copy 模块包含两个函数用来拷贝对象

copy(object) => object 创建给定对象的 "/浅层(shallow)" 拷贝(copy). 这里 "/浅层(shallow)" 的意思是复制对象本身但当对象是一个容器 (container) 它的成员仍然指向原来的成员对象.

 

1.13. sys 模块

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分.

1.13.1. 处理命令行参数

在解释器启动后argv 列表包含了传递给脚本的所有参数列表的第一个元素为脚本自身的名称.

如果是从标准输入读入脚本 (比如 "python < sys-argv-example-1.py"), 脚本的名称将被设置为空串如果把脚本作为字符串传递给python (使用 -c选项), 脚本名会被设置为 "-c".

1.13.2. 处理模块

path 列表是一个由目录名构成的列表, Python 从中查找扩展模块( Python 源模块编译模块,或者二进制扩展). 启动 Python ,这个列表从根据内建规则, PYTHONPATH 环境变量的内容以及注册表( Windows 系统)等进行初始化由于它只是一个普通的列表你可以在程序中对它进行操作

modules 字典包含所有加载的模块import 语句在从磁盘导入内容之前会先检查这个字典.

1.13.3. 处理引用记数

getrefcount 函数  返回给定对象的引用记数 也就是这个对象使用次数. Python 会跟踪这个值当它减少为0的时候就销毁这个对象.

1.13.4. 跟踪程序

setprofiler 函数允许你配置一个分析函数(profiling function). 这个函数会在每次调用某个函数或方法时被调用(明确或隐含的), 或是遇到异常的时候被调用基于该函数profile 模块提供了一个完整的分析器框架.

Example 1-73 中的 settrace 函数与此类似但是 trace 函数会在解释器每执行到新的一行时被调用.

基于该函数提供的跟踪功能pdb 模块提供了完整的调试( debug )框架.

1.13.5. 处理标准输出/输入

stdin , stdout , 以及 stderr 变量包含与标准 I/O 流对应的流对象如果需要更好地控制输出, print 不能满足你的要求它们就是你所需要的你也可以 替换 它们这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

1.13.6. 退出程序

执行至主程序的末尾时,解释器会自动退出但是如果需要中途退出程序你可以调用 sys.exit 函数它带有一个可选的整数参数返回给调用它的程序.在 Python 2.0 以后你可以使用 atexit 模块来注册多个退出处理函数.

 

1.14. atexit 模块

(用于2.0版本及以上atexit 模块允许你注册一个或多个终止函数(暂且这么叫), 这些函数将在解释器终止前被自动调用.

调用 register 函数便可以将函数注册为终止函数你也可以添加更多的参数这些将作为 exit 函数的参数传递.

该模块其实是一个对 sys.exitfunc 钩子( hook )的简单封装.

 

1.15. time 模块

time 模块提供了一些处理日期和一天内时间的函数它是建立在 运行时库的简单封装.

给定的日期和时间可以被表示为浮点型(从参考时间通常是 1970.1.1 到现在经过的秒数即 Unix 格式), 或者一个表示时间的 struct (类元组).

1.15.1. 获得当前时间

localtime  gmtime 返回的类元组包括年星期一年的第几天日光标志其中年是一个四位数(在有千年虫问题的平台上另有规定但还是四位数), 星期从星期一(数字 代表)开始, 11日是一年的第一天.

1.15.2. 将时间值转换为字符串

你可以使用标准的格式化字符串把时间对象转换为字符串不过 time 模块已经提供了许多标准转换函数

1.15.3. 将字符串转换为时间对象

在一些平台上time 模块包含了 strptime 函数它的作用与 strftime 相反给定一个字符串和模式它返回相应的时间对象

只有在系统的 库提供了相应的函数的时候time.strptime 函数才可以使用对于没有提供标准实现的平台

1.15.4. 转换时间值

将时间元组转换回时间值非常简单至少我们谈论的当地时间 (local time) 如此只要把时间元组传递给 mktime 函数

但是, 1.5.2 版本的标准库没有提供能将 UTC 时间 (Universal Time, Coordinated: 特林威治标准时间)转换为时间值的函数 ( Python 和对应底层 库都没有提供). Example 1-84 提供了该函数的一个 Python 实现称为 timegm .

从 1.6 版本开始calendar 模块提供了一个类似的函数 calendar.timegm .

1.15.5. Timing 相关

time 模块可以计算 Python 程序的执行时间你可以测量 "wall time" (real world time), 或是"进程时间" (消耗的 CPU 时间).

并不是所有的系统都能测量真实的进程时间一些系统中(包括 Windows ), clock 函数通常测量从程序启动到测量时的 wall time.

进程时间的精度受限制在一些系统中它超过 30 分钟后进程会被清理. (原文: On many systems, it wraps around after just over 30 minutes.)

另参见 timing 模块( Windows 下的朋友不用忙活了,没有地~), 它可以测量两个事件之间的 wall time.

 

1.16. types 模块

types 模块包含了标准解释器定义的所有类型的类型对象同一类型的所有对象共享一个类型对象你可以使用 is 来检查一个对象是不是属于某个给定类型.

注意所有的类都具有相同的类型所有的实例也是一样要测试一个类或者实例所属的类可以使用内建的 issubclass  isinstance 函数.

types 模块在第一次引入的时候会破坏当前的异常状态也就是说不要在异常处理语句块中导入该模块 (或其他会导入它的模块) .

 

1.17. gc 模块

(可选, 2.0 及以后版本gc 模块提供了到内建循环垃圾收集器的接口.

Python 使用引用记数来跟踪什么时候销毁一个对象一个对象的最后一个引用一旦消失这个对象就会被销毁.

从 2.0 版开始, Python 还提供了一个循环垃圾收集器它每隔一段时间执行这个收集器查找指向自身的数据结构并尝试破坏循环

你可以使用 gc.collect 函数来强制完整收集这个函数将返回收集器销毁的对象的数量.

如果你确定你的程序不会创建自引用的数据结构你可以使用 gc.disable 函数禁用垃圾收集调用这个函数以后, Python 的工作方式将与 1.5.2 或更早的版本相同.

 

2. 更多标准模块

"Now, imagine that your friend kept complaining that she didn‘t want to visit you since she found it too hard to climb up the drain pipe, and you kept telling her to use the friggin‘ stairs like everyone else..."

- eff-bot, June 1998

 

2.1. 概览

本章叙述了许多在 Python 程序中广泛使用的模块当然在大型的 Python 程序中不使用这些模块也是可以的但如果使用会节省你不少时间.

2.1.1. 文件与流

fileinput 模块可以让你更简单地向不同的文件写入内容该模块提供了一个简单的封装类一个简单的 for-in 语句就可以循环得到一个或多个文本文件的内容.

StringIO 模块 (以及 cStringIO 模块作为一个的变种实现了一个工作在内存的文件对象你可以在很多地方用 StringIO 对象替换普通的文件对象.

2.1.2. 类型封装

UserDict , UserList , 以及 UserString 是对应内建类型的顶层简单封装和内建类型不同的是这些封装是可以被继承的这在你需要一个和内建类型行为相似但由额外新方法的类的时候很有用.

2.1.3. 随机数字

random 模块提供了一些不同的随机数字生成器whrandom 模块与此相似但允许你创建多个生成器对象.

[!Feather 注: whrandom 在版本 2.1 时声明不支持. 请使用 random 替代.]

2.1.4. 加密算法

md5  sha 模块用于计算密写的信息标记( cryptographically strong message signatures , 所谓的 "message digests", 信息摘要).

crypt 模块实现了 DES 样式的单向加密该模块只在 Unix 系统下可用.

rotor 模块提供了简单的双向加密版本 2.4 以后的朋友可以不用忙活了.

[!Feather 注: 它在版本 2.3 时申明不支持, 因为它的加密运算不安全.]

 

2.2. fileinput 模块

fileinput 模块允许你循环一个或多个文本文件的内容

你也可以使用 fileinput 模块获得当前行的元信息 (meta information). 其中包括 isfirstline , filename , lineno ,

文本文件的替换操作很简单只需要把 inplace 关键字参数设置为 1 , 传递给 input 函数该模块会帮你做好一切

 

2.3. shutil 模块

shutil 实用模块包含了一些用于复制文件和文件夹的函数使用的 copy 函数使用和 Unix  cp 命令基本相同的方式复制一个文件.

copytree 函数用于复制整个目录树 ( cp -r 相同),  rmtree 函数用于删除整个目录树 ( rm -r ). 

 

2.4. tempfile 模块

 tempfile 模块允许你快速地创建名称唯一的临时文件供使用.

TemporaryFile 函数会自动挑选合适的文件名并打开文件, . 而且它会确保该文件在关闭的时候会被删除. (在 Unix 你可以删除一个已打开的文件这 时文件关闭时它会被自动删除在其他平台上这通过一个特殊的封装类实现.)

 

2.5. StringIO 模块

Example 2-8 展示了 StringIO 模块的使用它实现了一个工作在内存的文件对象 (内存文件). 在大多需要标准文件对象的地方都可以使用它来替换.

StringIO 类实现了内建文件对象的所有方法此外还有 getvalue 方法用来返回它内部的字符串值

StringIO 可以用于重新定向 Python 解释器的输出

 

2.6. cStringIO 模块

cStringIO 是一个可选的模块 StringIO 的更快速实现它的工作方式和 StringIO 基本相同但是它不可以被继承Example 2-11 展示了cStringIO 的用法另参考前一节.

为了让你的代码尽可能快但同时保证兼容低版本的 Python ,你可以使用一个小技巧在 cStringIO 不可用时启用 StringIO 模块

 

2.7. mmap 模块

(2.0 新增mmap 模块提供了操作系统内存映射函数的接口,  映射区域的行为和字符串对象类似但数据是直接从文件读取的.

在 Windows 这个文件必须以既可读又可写的模式打开( `r+` , `w+` , 或 `a+` ), 否则 mmap 调用会失败.

[!Feather 注: 经本人测试, a+ 模式是完全可以的, 原文只有 r+ 和 w+]

 

2.8. UserDict 模块

UserDict 模块包含了一个可继承的字典类 (事实上是对内建字典类型的 Python 封装).

Example 2-15 展示了一个增强的字典类允许对字典使用 "/+" 操作并提供了接受关键字参数的构造函数.

 

2.9. UserList 模块

UserList 模块包含了一个可继承的列表类 (事实上是对内建列表类型的 Python 封装).

AutoList 实例类似一个普通的列表对象但它允许你通过赋值为列表添加项目.

 

2.10. UserString 模块

(2.0 新增UserString 模块包含两个类UserString  MutableString . 前者是对标准字符串类型的封装后者是一个变种允许你修改特定位置的字符(联想下列表就知道了).

注意 MutableString 并不是效率很好许多操作是通过切片和字符串连接实现的如果性能很对你的脚本来说重要的话你最好使用字符串片断的列表或者array 模块

 

2.11. traceback 模块

 traceback 模块允许你在程序里打印异常的跟踪返回 (Traceback)信息类似未捕获异常时解释器所做的

 

2.12. errno 模块

errno 模块定义了许多的符号错误码比如 ENOENT ("没有该目录入口") 以及 EPERM ("权限被拒绝"). 它还提供了一个映射到对应平台数字错误代码的字典.

在大多情况下IOError 异常会提供一个二元元组包含对应数值错误代码和一个说明字符串如果你需要区分不同的错误代码那么最好在可能的地方使用符号名称.

 

2.13. getopt 模块

getopt 模块包含用于抽出命令行选项和参数的函数它可以处理多种格式的选项

其中第 个参数指定了允许的可缩写的选项选项名后的冒号(:) 意味这这个选项必须有额外的参数.

为了让 getopt 查找长的选项,, 传递一个描述选项的列表做为第 个参数如果一个选项名称以等号(=) 结尾那么它必须有一个附加参数.

 

2.14. getpass 模块

getpass 模块提供了平台无关的在命令行下输入密码的方法

getpass(prompt) 会显示提示字符串关闭键盘的屏幕反馈然后读取密码如果提示参数省略那么它将打印出 "Password:".

getuser() 获得当前用户名如果可能的话.

 

2.15. glob 模块

glob 根据给定模式生成满足该模式的文件名列表和 Unix shell 相同.

这里的模式和正则表达式类似但更简单星号(*) 匹配零个或更多个字符问号(?) 匹配单个字符你也可以使用方括号来指定字符范围例如 [0-9] 代表一个数字其他所有字符都代表它们本身.

glob(pattern) 返回满足给定模式的所有文件的列表Example 2-26 展示了它的用法.

注意这里的 glob 返回完整路径名这点和 os.listdir 函数不同glob 事实上使用了 fnmatch 模块来完成模式匹配.

 

2.16. fnmatch 模块

fnmatch 模块使用模式来匹配文件名

模式语法和 Unix shell 中所使用的相同星号(*) 匹配零个或更多个字符问号(?) 匹配单个字符你也可以使用方括号来指定字符范围例如 [0-9] 代表一个数字其他所有字符都匹配它们本身.

Example 2-28 中的 translate 函数可以将一个文件匹配模式转换为正则表达式.

glob  find 模块在内部使用 fnmatch 模块来实现.

 

2.17. random 模块

"Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin."

- John von Neumann, 1951

random 模块包含许多随机数生成器.

基本随机数生成器(基于 Wichmann 和 Hill , 1982 的数学运算理论可以通过很多方法访问 Example 2-29 所示.

注意这里的 randint 函数可以返回上界而其他函数总是返回小于上界的值所有函数都有可能返回下界值.

Example 2-30 展示了 choice 函数它用来从一个序列里分拣出一个随机项目它可以用于列表元组以及其他序列(当然非空的).

在 2.0 及以后版本shuffle 函数可以用于打乱一个列表的内容 (也就是生成一个该列表的随机全排列). Example 2-31 展示了如何在旧版本中实现该函数.

random 模块也包含了非恒定分布的随机生成器函数Example 2-32 使用了 gauss (高斯)函数来生成满足高斯分的布随机数字.

你可以在 Python Library Reference 找到更多关于非恒定分布随机生成器函数的信息.

标准库中提供的随机数生成器都是伪随机数生成器不过这对于很多目的来说已经足够了比如模拟数值分析以及游戏可以确定的是它不适合密码学用途.

 

2.18. whrandom 模块

这个模块早在 2.1 就被声明不赞成早废了请使用 random 代替
- Feather

Example 2-33 展示了 whrandom , 它提供了一个伪随机数生成器. (基于 Wichmann 和 Hill, 1982 的数学运算理论). 除非你需要不共享状态的多个生成器(如多线程程序), 请使用 random 模块代替.

 

2.19. md5 模块

md5 (Message-Digest Algorithm 5)模块用于计算信息密文(信息摘要).

md5 算法计算一个强壮的128位密文这意味着如果两个字符串是不同的那么有极高可能它们的 md5 也不同也就是说给定一个 md5 密文那么几乎没有可能再找到另个字符串的密文与此相同Example 2-35 展示了如何使用 md5 模块.

千万别忘记内建的伪随机生成器对于加密操作而言并不合适千万小心.

 

2.20. sha 模块

sha 模块提供了计算信息摘要(密文)的另种方法 Example 2-39 所示它与 md5 模块类似但生成的是 160 位签名.

 

2.21. crypt 模块

(可选只用于 Unix) crypt 模块实现了单向的 DES 加密, Unix 系统使用这个加密算法来储存密码这个模块真正也就只在检查这样的密码时有用.

Example 2-40 展示了如何使用 crypt.crypt 来加密一个密码将密码和 salt 组合起来然后传递给函数这里的 salt 包含两位随机字符现在你可以扔掉原密码而只保存加密后的字符串了.

确认密码时只需要用新密码调用加密函数并取加密后字符串的前两位作为 salt 即可如 果结果和加密后字符串匹配那么密码就是正确的Example 2-41使用 pwd 模块来获取已知用户的加密后密码.

 

2.22. rotor 模块

这个模块在 2.3 时被声明不赞成, 2.4 时废了因为它的加密算法不安全
- Feather

(可选rotor 模块实现了一个简单的加密算法 Example 2-42 所示它的算法基于 WWII Enigma engine.

 

2.23. zlib 模块

(可选zlib 模块为 "zlib" 压缩提供支持. (这种压缩方法是 "deflate".)

Example 2-43 展示了如何使用 compress  decompress 函数接受字符串参数.

 

2.24. code 模块

code 模块提供了一些用于模拟标准交互解释器行为的函数.

compile_command 与内建 compile 函数行为相似但它会通过测试来保证你传递的是一个完成的 Python 语句.

 Example 2-47 我们一行一行地编译一个程序编译完成后会执行所得到的代码对象 (code object). 程序代码如下:

a = ( 1, 2, 3 ) print a

注意只有我们到达第 个括号元组的赋值操作能编译完成.

InteractiveConsole 类实现了一个交互控制台类似你启动的 Python 解释器交互模式.

控制台可以是活动的(自动调用函数到达下一行或是被动的(当有新数据时调用 push 方法). 默认使用内建的 raw_input 函数如果你想使用另个输入函数你可以使用相同的名称重载这个方法Example 2-48 展示了如何使用 code 模块来模拟交互解释器.

 

3. 线程和进程

"Well, since you last asked us to stop, this thread has moved from discussing languages suitable for professional programmers via accidental users to computer-phobic users. A few more iterations can make this thread really interesting..."

- eff-bot, June 1996

 

3.1. 概览

本章将介绍标准 Python 解释器中所提供的线程支持模块注意线程支持模块是可选的有可能在一些 Python 解释器中不可用.

本章还涵盖了一些 Unix 和 Windows 下用于执行外部进程的模块.

3.1.1. 线程

执行 Python 程序的时候是按照从主模块顶端向下执行的循环用于重复执行部分代码函数和方法会将控制临时移交到程序的另一部分.

通过线程你的程序可以在同时处理多个任务每个线程都有它自己的控制流所以你可以在一个线程里从文件读取数据另个向屏幕输出内容.

为了保证两个线程可以同时访问相同的内部数据, Python 使用了 global interpreter lock (全局解释器锁)在同一时间只可能有一个线程执行 Python 代码; Python 实际上是自动地在一段很短的时间后切换到下个线程执行或者等待 一个线程执行一项需要时间的操作(例如等待通过 socket 传输的数据或是从文件中读取数据).

全局锁事实上并不能避免你程序中的问题多个线程尝试访问相同的数据会导致异常 状态例如以下的代码:

def getitem(key): item = cache.get(key) if item is None: # not in cache; create a new one item = create_new_item(key) cache[key] = item return item

如果不同的线程先后使用相同的 key 调用这里的 getitem 方法那么它们很可能会导致相同的参数调用两次 create_new_item . 大多时候这样做没有问题但在某些时候会导致严重错误.

不过你可以使用 lock objects 来同步线程一个线程只能拥有一个 lock object , 这样就可以确保某个时刻 只有一个线程执行 getitem 函数.

3.1.2. 进程

在大多现代操作系统中每个程序在它自身的进程( process )内执行我们通过在 shell 中键入命令或直接在菜单中选择来执行一个程序/进程. Python 允许你在一个脚本内执行一个新的程序.

大多进程相关函数通过 os 模块定义相关内容请参阅 第 1.4.4 小节 .

 

3.2. threading 模块

(可选threading 模块为线程提供了一个高级接口 Example 3-1 所示它源自 Java 的线程实现和低级的 thread 模块相同只有你在编译解释器时打开了线程支持才可以使用它 .

你只需要继承 Thread 定义好 run 方法就可以创建一 个新的线程使用时首先创建该类的一个或多个实例然后调用 start 方法这样每个实例的run 方法都会运行在它自己的线程里.

Example 3-1 使用了 Lock 对象来在全局 Counter 对象里创建临界区 (critical section). 如果删除了 acquire  release 语句那么 Counter 很可能不会到达 100.

 

3.3. Queue 模块

Queue 模块提供了一个线程安全的队列 (queue) 实现, . 你可以通过它在多个线程里安全访问同个对象.

Example 3-3 展示了如何限制队列的大小如果队列满了那么控制主线程 (producer threads) 被阻塞等待项目被弹出 (pop off).

你可以通过继承 Queue 类来修改它的行为Example 3-4 为我们展示了一个简单的具有优先级的队列它接受一个元组作为参数元组的第一个成员表示优先级(数值越小优先级越高).

 

3.4. thread 模块

(可选thread 模块提为线程提供了一个低级 (low_level) 的接口只有你在编译解释器时打开了线程支持才可以使用它如果没有特殊需要最好使用高级接口 threading 模块替代.

 

3.5. commands 模块

(只用于 Unix) commands 模块包含一些用于执行外部命令的函数

 

3.6. pipes 模块

(只用于 Unix) pipes 模块提供了 "转换管道 (conversion pipelines)" 的支持你可以创建包含许多外部工具调用的管道来处理多个文件

 

3.7. popen2 模块

popen2 模块允许你执行外部命令并通过流来分别访问它的 stdin  stdout ( 可能还有 stderr ).

在 python 1.5.2 以及之前版本该模块只存在于 Unix 平台上. 2.0 , Windows 下也实现了该函数

 

3.8. signal 模块

你可以使用 signal 模块配置你自己的信号处理器 (signal handler),  Example 3-11 所示当解释器收到某个信号时信号处理器会立即执行.

 

4. 数据表示

"PALO ALTO, Calif. - Intel says its Pentium Pro and new Pentium II chips have a flaw that can cause computers to sometimes make mistakes but said the problems could be fixed easily with rewritten software."

- Reuters telegram

 

4.1. 概览

本章描述了一些用于在 Python 对象和其他数据表示类型间相互转换的模块这些模块通常用于读写特定的文件格式或是储存/取出 Python 变量.

4.1.1. 二进制数据

Python 提供了一些用于二进制数据解码/编码的模块struct 模块用于在 二进制数据结构(例如 中的 struct )和 Python 元组间转换array 模块将二进制数据阵列 ( C arrays )封装为 Python 序列对象.

4.1.2. 自描述格式

marshal  pickle 模块用于在不同的 Python 程序间共享/传递数据.

marshal 模块使用了简单的自描述格式( Self-Describing Formats ), 它支持大多的内建数据类型包括 code 对象. Python 自身也使用了这个格式来储存编译后代码( .pyc 文件).

pickle 模块提供了更复杂的格式它支持用户定义的类自引用数据结构等等pickle 是用 Python 写的相对来说速度较慢不过还有一个 cPickle 模块使用 实现了相同的功能速度和 marshal 不相上下.

4.1.3. 输出格式

一些模块提供了增强的格式化输出用来补充内建的 repr 函数和 字符串格式化操作符.

pprint 模块几乎可以将任何 Python 数据结构很好地打印出来(提高可读性).

repr 模块可以用来替换内建同名函数该模块与内建函数不同的是它限制了很多输出形式他只会 输出字符串的前 30 个字符它只打印嵌套数据结构的几个等级等等.

4.1.4. 编码二进制数据

Python 支持大部分常见二进制编码例如 base64 , binhex (一种 Macintosh 格式) , quoted printable , 以及 uu 编码.

 

4.2. array 模块

array 模块实现了一个有效的阵列储存类型阵列和列表类似但其中所有的项目必须为相同的 类型该类型在阵列创建时指定.

Examples 4-1 到 4-5 都是很简单的范例Example 4-1 创建了一个 array 对象然后使用 tostring 方法将内部缓冲区( internal buffer )复制到字符串.

 

4.3. struct 模块

struct 模块用于转换二进制字符串和 Python 元组pack 函数接受格式字符串以及额外参数根据指定格式将额外参数转换为二进制字符串upack 函数接受一个字符串作为参数返回一个元组

 

4.4. xdrlib 模块

xdrlib 模块用于在 Python 数据类型和 Sun 的 external data representation (XDR) 间相互转化

 

4.5. marshal 模块

marshal 模块可以把不连续的数据组合起来 与字符串相互转化这样它们就可以写入文件或是在网络中传输

marshal 模块使用了简单的自描述格式对于每个数据项目格式化后的字符串都包含一个类型代码然后是一个或多个类型标识区域整数使用小字节序( little-endian order )储存字符串储存时和它自身内容长度相同(可能包含空字节), 元组由组成它的对象组合表示.

 

4.6. pickle 模块

pickle 模块同 marshal 模块相同将数据连续化便于保存传输它比 marshal 要慢一些但它可以处理类实例共享的元素以及递归数据结构等.

 

4.7. cPickle 模块

(可选注意大小写) cPickle 模块是针对 pickle 模块的一个更快的实现.

 

4.8. copy_reg 模块

你可以使用 copy_reg 模块注册你自己的扩展类型这样 pickle  copy 模块就会知道 如何处理非标准类型.

我们可以注册一个 code 对象处理器来完成目标处理器应包含两个部分一个 pickler , 接受 code 对象 并返回一个只包含简单数据类型的元组以及一个unpickler , 作用相反接受这样的元组作为参数.

如果你是在网络中传输 pickle 后的数据那么请确保自定义的 unpickler 在数据接收端也是可用的.

 

4.9. pprint 模块

pprint 模块( pretty printer )用于打印 Python 数据结构当你在命令行下打印 特定数据结构时你会发现它很有用(输出格式比较整齐便于阅读).

 

4.10. repr 模块

repr 模块提供了内建 repr 函数的另个版本它限制了很多(字符串长度递归等). 

 

4.11. base64 模块

base64 编码体系用于将任意二进制数据转换为纯文本它将一个 字节的二进制字节组 转换为 个文本字符组储存而且规定只允许以下集合中的字符出现:

 

4.12. binhex 模块

binhex 模块用于到 Macintosh BinHex 格式的相互转化

该模块有两个函数 binhex  hexbin .

 

4.13. quopri 模块

quopri 模块基于 MIME 标准实现了引用的可打印编码( quoted printable encoding ).

这样的编码可以将不包含或只包含一部分U.S. ASCII 文本的信息例如大多欧洲语言中文转换为只包含 U.S. ASCII 的信息在一些老式的 mail 代理中你会发现这很有用因为它们一般不支持特殊

 

4.14. uu 模块

uu 编码体系用于将任意二进制数据转换为普通文本格式该格式在新闻组中很流行但逐渐被 base64 编码取代.

uu 编码将每个 字节( 24 )的数据组转换为 个可打印字符(每个字符 ), 使用从 chr(32) (空格到 chr(95) 的字符. uu 编码通常会使数据大小增加 40% .

一个编码后的数据流以一个新行开始它包含文件的权限( Unix 格式)和文件名以 end 行结尾:

begin 666 sample.jpg M_]C_X 02D9)1@ ! 0 0 ! #_VP!# @&!@<&!0@‘!P<)‘0@*#!0-# L+ ...more lines like this... end

uu 模块提供了两个函数encode  decode .

encode(infile, outfile, filename) 函数从编码输入文件中的数据然后写入到输出文件中. . infile 和 outfile 可以是文件名或文件对象. filename 参数作为起始域的文件名写入.

 

4.15. binascii 模块

binascii 提供了多个编码的支持函数包括 base64 , binhex , 以及 uu . 2.0 及以后版本中你还可以使用它在二进制数据和十六进制字符串中相互转换.

 

5. 文件格式

 

5.1. 概览

本章将描述用于处理不同文件格式的模块.

5.1.1. Markup 语言

Python 提供了一些用于处理可扩展标记语言( Extensible Markup Language , XML ) 和超文本标记语言( Hypertext Markup Language , HTML )的扩展. Python 同样提供了对 标准通用标记语言( Standard Generalized Markup Language , SGML )的支持.

所有这些格式都有着相同的结构因为 HTML 和 XML 都来自 SGML . 每个文档都是由 起始标签( start tags ), 结束标签( end tags ), 文本(又叫字符数据), 以及实体引用( entity references )构成:

<document name="sample.xml"> <header>This is a header</header> <body>This is the body text. The text can contain plain text ("character data"), tags, and entities. </body> </document>

在这个例子中<document>, <header>, 以及 <body> 是起始标签每个起始标签都有一个对应的结束标签使用斜线 "/" 标记起始标签可以包含多个属性比如这里的 name 属性.

起始标签和它对应的结束标签中的任何东西被称为 元素( element )这里 document 元素包含 header  body 两个元素.

是一个字符实体( character entity ). 字符实体用于在文本区域中表示特殊的保留字符使用 指示这里它代表一个引号常见字符实体还有 < ( < )" 和 > ( > )" .

虽然 XML , HTML , SGML 使用相同的结构块但它们还有一些不同点在 XML 所有元素必须有起始和结束标签所有标签必须正确嵌套( well-formed ). 而且 XML 是区分大小写的所以 <document>  <Document> 是不同的元素类型.

HTML 有很高灵活性, HTML 语法分析器一般会自动补全缺失标签例如当遇到一个以 <P> 标签开始的新段落却没有对应结束标签语法分析器会自动添加一个 </P> 标签. HTML 也是区分大小写的另一方面, XML 允许你定义任何元素而 HTML 使用一些由 HTML 规范定义的固定元素.

SGML 有着更高的灵活性你可以使用自己的声明( declaration ) 定义源文件如何转换到元素结构, DTD ( document type description , 文件类型定义)可以用来 检查结构并补全缺失标签技术上来说, HTML 和 XML 都是 SGML 应用有各自的 SGML 声明而且 HTML 有一个标准 DTD .

Python 提供了多个 makeup 语言分析器由于 SGML 是最灵活的格式, Python  sgmllib 事实上很简单它不会去处理 DTD , 不过你可以继承它来提供更复杂的功能.

Python 的 HTML 支持基于 SGML 分析器htmllib 将具体的格式输出工作交给 formatter 对象formatter 模块包含一些标准格式化标志.

Python 的 XML 支持模块很复杂先前是只有与 sgmllib 类似的 xmllib , 后来加入了更高级的 expat 模块(可选). 而最新版本中已经准备废弃 xmllib ,启用 xml 包作为工具集.

5.1.2. 配置文件

ConfigParser 模块用于读取简单的配置文件类似 Windows 下的 INI 文件.

netrc 模块用于读取 .netrc 配置文件, shlex 模块用于读取类似 shell 脚本语法的配置文件.

5.1.3. 压缩档案格式

Python 的标准库提供了对 GZIP 和 ZIP ( 2.0 及以后格式的支持基于 zlib 模块gzip  zipfile 模块分别用来处理这类文件.

 

5.2. xmllib 模块

xmllib 已在当前版本中申明不支持.

xmlib 模块提供了一个简单的 XML 语法分析器使用正则表达式将 XML 数据分离,  语法分析器只对文档做基本的检查例如是否只有一个顶层元素所有的标签是否匹配.

XML 数据一块一块地发送给 xmllib 分析器(例如在网路中传输的数据). 分析器在遇到起始标签数据区域结束标签和实体的时候调用不同的方法.

如果你只是对某些标签感兴趣你可以定义特殊的 start_tag  end_tag 方法这里 tag 是标签名称这些 start 函数使用它们对应标签的属性作为参数调用(传递时为一个字典).

 

5.3. xml.parsers.expat 模块

(可选xml.parsers.expat 模块是 James Clark‘s Expat XML parser 的接口

 

5.4. sgmllib 模块

sgmllib 模块提供了一个基本的 SGML 语法分析器它与 xmllib 分析器基本相同但限制更少(而且不是很完善). 

和在 xmllib 中一样这个分析器在遇到起始标签数据区域结束标签以及实体时调用内部方法如果你只是对某些标签感兴趣那么你可以定义特殊的方法.

我们使用列表保存所有起始标签然后检查每个结束标签是否匹配前个起始标签最后确认到达文件末尾时没有未关闭的标签.

 

5.5. htmllib 模块

htmlib 模块包含了一个标签驱动的( tag-driven ) HTML 语法分析器它会将数据发送至一个格式化对象.  更多关于如何解析 HTML 的例子请参阅 formatter 模块.

如果你只是想解析一个 HTML 文件而不是将它交给输出设备那么 sgmllib 模块会是更好的选择.

 

5.6. htmlentitydefs 模块

htmlentitydefs 模块包含一个由 HTML 中 ISO Latin-1 字符实体构成的字典

 

5.7. formatter 模块

formatter 模块提供了一些可用于 htmllib 的格式类( formatter classes ).

这些类有两种formatter  writer . formatter 将 HTML 解析器的标签和数据流转换为适合输出设备的事件流( event stream ), 而 writer 将事件流输出到设备上

大多情况下你可以使用 AbstractFormatter 类进行格式化它会根据不同的格式化事件调用 writer 对象的方法AbstractWriter 类在每次方法调用时打印一条信息.

 

5.8. ConfigParser 模块

ConfigParser 模块用于读取配置文件.

配置文件的格式与 Windows INI 文件类似可以包含一个或多个区域( section ), 每个区域可以有多个配置条目.

这里有个样例配置文件

[book] title: The Python Standard Library author: Fredrik Lundh email: fredrik@pythonware.com version: 2.0-001115 [ematter] pages: 250 [hardcopy] pages: 350

 

 

5.9. netrc 模块

netrc 模块可以用来解析 .netrc 配置文件如 Example 5-18 所示该文件用于在用户的 home 目录储存 FTP 用户名和密码. (别忘记设置这个文件的属性为: "chmod 0600 ~/.netrc," 这样只有当前用户能访问).

 

5.10. shlex 模块

shlex 模块为基于 Unix shell 语法的语言提供了一个简单的 lexer (也就是 tokenizer). 

 

5.11. zipfile 模块

( 2.0 新增zipfile 模块可以用来读写 ZIP 格式.

5.11.1. 列出内容

使用 namelist  infolist 方法可以列出压缩档的内容前者返回由文件名组成的列表后者返回由 ZipInfo 实例组成的列表

5.11.2. 从 ZIP 文件中读取数据

调用 read 方法就可以从 ZIP 文档中读取数据它接受一个文件名作为参数返回字符串

5.11.3. 向 ZIP 文件写入数据

向压缩档加入文件很简单将文件名文件在 ZIP 档中的名称传递给 write 方法即可.

write 方法的第三个可选参数用于控制是否使用压缩默认为 zipfile.ZIP_STORED , 意味着只是将数据储存在档案里而不进行任何压缩如果安装了zlib 模块那么就可以使用 zipfile.ZIP_DEFLATED 进行压缩.

zipfile 模块也可以向档案中添加字符串不过这需要一点技巧你需要创建一个 ZipInfo 实例并正确配置它

 

5.12. gzip 模块

gzip 模块用来读写 gzip 格式的压缩文件,

 

6. 邮件和新闻消息处理

"To be removed from our list of future commercial postings by [SOME] PUBLISHING COMPANY an Annual Charge of Ninety Five dollars is required. Just send $95.00 with your Name, Address and Name of the Newsgroup to be removed from our list."

- Newsgroup spammer, July 1996

"想要退出 ‘ 宣传公司的未来商业广告列表吗您需要付 95 美元只要您支付95美元并且告诉我们您的姓名地址和需要退出的新闻组我们就会把您从列表中移除."

新闻组垃圾发送者, 1996 年 

 

6.1. 概览

Python 有大量用于处理邮件和新闻组的模块其中包括了许多常见的邮件格式.

 

6.2. rfc822 模块

rfc822 模块包括了一个邮件和新闻组的解析器 (也可用于其它符合 RFC 822 标准的消息比如 HTTP ).

通常, RFC 822 格式的消息包含一些标头字段后面至少有一个空行然后是信息主体.

消息解析器读取标头字段后会返回一个以消息标头为键的类字典对象地址字段被解析为 (实际名称邮件地址这样的元组数据字段被解析为 元时间元组可以使用 time 模块处理.

 

6.3. mimetools 模块

多用途因特网邮件扩展 ( Multipurpose Internet Mail Extensions, MIME ) 标准定义了如何在 RFC 822 格式的消息中储存非 ASCII 文本图像以及其它数据.

mimetools 模块包含一些读写 MIME 信息的工具它还提供了一个类似 rfc822 模块中 Message 的类用于处理 MIME 编码的信息

 

6.4. MimeWriter 模块

MimeWriter 模块用于生成符合 MIME 邮件标准的 "多部分的信息

 

6.5. mailbox 模块

mailbox 模块用来处理各种不同类型的邮箱格式大部分邮箱格式使用文本文件储存纯 RFC 822 信息用分割行区别不同的信息.

 

6.6. mailcap 模块

mailcap 模块用于处理 mailcap 文件该文件指定了不同的文档格式的处理方法( Unix 系统下). 

 

6.7. mimetypes 模块

mimetypes 模块可以判断给定 url ( uniform resource locator , 统一资源定位符的 MIME 类型它基于一个内建的表还可能搜索 Apache 和 Netscape 的配置文件

 

6.8. packmail 模块

(已废弃packmail 模块可以用来创建 Unix shell 档案如果安装了合适的工具那么你就可以直接通过运行来解开这样的档案.注意这个模块不能处理二进制文件例如声音或者图像文件.

 

6.9. mimify 模块

mimify 模块用于在 MIME 编码的文本信息和普通文本信息(例如 ISO Latin 1 文本)间相互转换它可以用作命令行工具或是特定邮件代理的转换过滤器:

 

6.10. multifile 模块

multifile 模块允许你将一个多部分的 MIME 信息的每部分作为单独的文件处理

 

7. 网络协议

"Increasingly, people seem to misinterpret complexity as sophistication, which is baffling - the incomprehensible should cause suspicion rather than admiration. Possibly this trend results from a mistaken belief that using a somewhat mysterious device confers an aura of power on the user."

- Niklaus Wirth

 

7.1. 概览

本章描述了 Python 的 socket 协议支持以及其他建立在 socket 模块上的网络 模块这些包含了对大多流行 Internet 协议客户端的支持以及一些可用来 实现 Internet 服务器的框架.

对于那些本章中的底层的例子我将使用两个协议作为样例: Internet Time Protocol ( Internet 时间协议 以及 Hypertext Transfer Protocol (超文本传输协议, HTTP 协议).

7.1.1. Internet 时间协议

Internet 时间协议 ( RFC 868, Postel 和 Harrenstien, 1983) 可以让 一个网络客户端获得一个服务器的当前时间.

因为这个协议是轻量级的许多 Unix 系统(但不是所有)都提供了这个服务它可能是最简单的网络协议了服务器等待连接请求并在连接后返回当前时间 ( 4 字节整数自从 1900 年 月 日到当前的秒数).

7.1.2. HTTP 协议

超文本传输协议 ( HTTP, RFC 2616 ) 是另个完全不同的东西最近的格式说明书( Version 1.1 )超过了 100 .

从它最简单的格式来看这个协议是很简单的客户端发送如下的请求到服务器请求一个文件:

GET /hello.txt HTTP/1.0 Host: hostname User-Agent: name [optional request body , 可选的请求正文]

服务器返回对应的响应:

HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 7 Hello

请求和响应的 headers (报头)一般会包含更多的域但是请求 header 中的 Host /字段是必须提供的.

header 行使用 "/r/n" 分割而且 header 后必须有一个空行即使没有正文 (请求和响应都必须符合这条规则).

剩下的 HTTP 协议格式说明书细节例如内容协商缓存机制保持连接等等请参阅 Hypertext TransferProtocol - HTTP/1.1 ( http://www.w3.org/Protocols).

 

7.2. socket 模块

socket 模块实现了到 socket 通讯层的接口你可以使用该模块创建 客户端或是服务器的 socket .

我们首先以一个客户端为例Example 7-1 中的客户端连接到一个时间协议服务器读取 字节的返回数据并把它转换为一个时间值.

socket 工厂函数( factory function )根据给定类型(该例子中为 Internet stream socket , 即就是 TCP socket )创建一个新的 socket . connect 方法尝试将这个 socket 连接到指定服务器上成功后就可以使用 recv 方法读取数据.

创建一个服务器 socket 使用的是相同的方法不过这里不是连接到服务器而是将 socket bind (绑定)到本机的一个端口上告诉它去监听连接请求然后尽快处理每个到达的请求.

Example 7-2 创建了一个时间服务器绑定到本机的 8037 端口( 1024 前的所有端口 是为系统服务保留的, Unix 系统下访问它们你必须要有 root 权限).

listen 函数的调用告诉 socket 我们期望接受连接参数代表连接 的队列(用于在程序没有处理前保持连接)大小最后 accept 循环将当前时间返回 给每个连接的客户端.

注意这里的 accept 函数返回一个新的 socket 对象这个对象是直接连接到客户端 的而原 socket 只是用来保持连接所有后来的数据传输操作都使用新的 socket .

我们可以使用 Example 7-3 , ( Example 7-1 的通用化版本)来测试这个服务器, .

Example 7-3 所示的脚本也可以作为模块使用你只需要导入 timeclient 模块然后调用它的 gettime 函数.

目前为止我们已经使用了流( TCP ) socket . 时间协议还提到了 UDP sockets (报文). 流 socket 的工作模式和电话线类似你会知道在远端 是否有人拿起接听器在对方挂断的时候你也会注意到相比之下发送报文更像 是在一间黑屋子里大声喊可能某人会在那里但你只有在他回复的时候才会知道.

 Example 7-4 所示你不需要在通过报文 socket 发送数据时连接远程机器只需使用 sendto 方法它接受数据和接收者地址作为参数读取报文的时候使用 recvfrom 方法.

这里的 recvfrom 返回两个值数据和发送者的地址后者用于发送回复数据.

最主要的不同在于服务器使用 bind 来分配一个已知端口给 socket , 根据 recvfrom 函数返回的地址向客户端发送数据.

 

7.3. select 模块

select 模块允许你检查一个或多个 socket , 管道以及其他流兼容对象所接受的数据如 Example 7-6 所示.

你可以将一个或更多 socket 传递给 select 函数然后等待它们状态改变(可读可写或是发送错误信号):

  • 如果某人在调用了 listen 函数后连接当远端数据到达时, socket 就成为可读的(这意味着 accept 不会阻塞). 或者是 socket 被关闭或重置时(在此情况下recv 会返回一个空字符串).
  • 当非阻塞调用 connect 方法后建立连接或是数据可以被写入到 socket , socket 就成为可写的.
  • 当非阻塞调用 connect 方法后连接失败后, socket 会发出一个错误信号.

 Example 7-6 我们等待监听 socket 变成可读状态这代表有一个连接请求到达我们用和之前一样的方法处理 channel socket , 因为它不可能因为等待 字节而填充网络 缓冲区如果你需要向客户端发送大量的数据那么你应该在循环的顶端把数据加入到 is_writable 列表中并且只在 select 允许的情况下写入.

如果你设置 socket 非阻塞模式(通过调用 setblocking 方法), 那么你就可以使用 select 来等待 socket 连接不过 asyncore 模块(参见下一节)提供了一个强大的框架它自动为你处理好了这一切所以我不准备在这里多说什么看下一节吧.

 

7.4. asyncore 模块

asyncore 模块提供了一个 "反馈性的( reactive )" socket 实现该模块允许你定义特定过程完成后所执行的代码而不是创建 socket 对象调用它们的方法你只需要继承 dispatcher 然后重载如下方法 (可以选择重载某一个或多个)就可以实现异步的 socket 处理器.

  • handle_connect : 一个连接成功建立后被调用.
  • handle_expt : 连接失败后被调用.
  • handle_accept : 连接请求建立到一个监听 socket 上时被调用回调时( callback )应该使用 accept 方法来获得客户端 socket .
  • handle_read : 有来自 socket 的数据等待读取时被调用回调时应该使用 recv 方法来获得数据.
  • handle_write : socket 可以写入数据的时候被调用使用 send 方法写入数据.
  • handle_close : 当 socket 被关闭或复位时被调用.
  • handle_error(type, value, traceback) 在任何一个回调函数发生 Python 错误时被调用默认的实现会打印跟踪返回消息到 sys.stdout .

Example 7-7 展示了一个时间客户端 socket 模块中的那个类似.

如果你不想记录任何信息那么你可以在你的 dispatcher 类里重载 log 方法.

Example 7-8 展示了对应的时间服务器注意这里它使用了两个 dispatcher 子类一个用于监听 socket , 另个用于与客户端通讯.

除了 dispatcher 这个模块还包含一个 dispatcher_with_send 你可以使用这个类发送大量的数据而不会阻塞网络通讯缓冲区.

Example 7-9 中的模块通过继承 dispatcher_with_send 类定义了一个 AsyncHTTP 当你创建一个它的实例后它会发出一个 HTTP GET 请求并把 接受到的数据发送到一个 "consumer" 目标对象

如果服务器返回状态 301 (永久重定向或者是 302 (临时重定向), 重定向的 consumer 会关闭当前请求并向新地址发出新请求所有对 consumer 的其他调用传递给原来的 consumer .

 

7.5. asynchat 模块

asynchat 模块是对 asyncore 的一个扩展它提供对面向行( line-oriented )的协议的额外支持它还提供了增强的缓冲区支持(通过 push 方法和 "producer" 机制.

现了一个很小的 HTTP 服务器它只是简单地返回包含 HTTP 请求信息的 HTML 文档(浏览器窗口出现的输出).

producer 接口允许你传入( "push" )太大以至于无法在内存中储存的对象asyncore 在需要更多数据的时候自动调用 producer  more 方法另外它使用一个空字符串标记文件的末尾.

 

 

7.6. urllib 模块

urlib 模块为 HTTP , FTP , 以及 gopher 提供了一个统一的客户端接口它会自动地根据 URL 选择合适的协议处理器.

从 URL 获取数据是非常简单的只需要调用 urlopen 方法然后从返回的流对象中读取数据即可,

这个流对象提供了一些非标准的属性headers 是一个 Message 对象( mimetools 模块中定义), url 是实际的 URL . 后者会根据服务器的重定向而更新.

urlopen 函数实际上是一个辅助函数它会创建一个 FancyURLopener 类的实例并调用它的 open 方法你也可以继承这个类来完成特殊的行为

 

7.7. urlparse 模块

urlparse 模块包含用于处理 URL 的函数可以在 URL 和平台特定的文件名间相互转换

一个常见用途就是把 HTTP URL 分割为主机名和路径组件(一个 HTTP 请求会涉及到 主机名以及请求路径), 

 

7.8. cookie 模块

(2.0 中新增该模块为 HTTP 客户端和服务器提供了基本的 cookie 支持

 

7.9. robotparser 模块

(2.0 中新增robotparser 模块用来读取 robots.txt 文件该文件用于 Robot Exclusion Protocol (搜索机器人排除协议?http://info.webcrawler.com/mak/projects/robots/robots.html).

如果你实现的一个 HTTP 机器人会访问网路上的任意站点(并不只是你自己的站点), 那么最好还是用该模块检查下你所做的一切是不是受欢迎的

 

7.10. ftplib 模块

ftplib 模块包含了一个 File Transfer Protocol (FTP , 文件传输协议)客户端的实现.

 

7.11. gopherlib 模块

gopherlib 模块包含了一个 gopher 客户端实现,

 

7.12. httplib 模块

httplib 模块提供了一个 HTTP 客户端接口

注意 httplib 提供的 HTTP 客户端在等待服务器回复的时候会阻塞程序异步的解决方法请参阅 asyncore 模块中的例子.

7.12.1. 将数据发送给服务器

httplib 可以用来发送其他 HTTP 命令例如 POST , .

 

7.13. poplib 模块

poplib 模块提供了一个 Post Office Protocol ( POP3 协议客户端实现这个协议用来从邮件服务器 "pop" (拷贝信息到你的个人电脑.

 

7.14. imaplib 模块

imaplib 模块提供了一个 Internet Message Access Protocol ( IMAP, Internet 消息访问协议的客户端实现这个协议允许你访问邮件服务器的邮件目录就好像是在本机访问一样.

 

7.15. smtplib 模块

smtplib 模块提供了一个 Simple Mail Transfer Protocol ( SMTP , 简单邮件传输协议客户端实现该协议用于通过 Unix 邮件服务器发送邮件

读取邮件请使用 poplib  imaplib 模块.

 

7.16. telnetlib 模块

telnetlib 模块提供了一个 telnet 客户端实现.

 

7.17. nntplib 模块

nntplib 模块提供了一个网络新闻传输协议( Network News Transfer Protocol, NNTP )客户端的实现.

7.17.1. 列出消息

从新闻服务器上读取消息之前你必须连接这个服务器并选择一个新闻组

 

7.18. SocketServer 模块

SocketServer 为各种基于 socket 的服务器提供了一个框架该模块提供了大量的类你可以用它们来创建不同的服务器.

 

7.19. BaseHTTPServer 模块

这是一个建立在 SocketServer 框架上的基本框架用于 HTTP 服务器.

在每次重新载入页面时会生成一条随机信息path 变量包含当前 URL , 你可以使用它为不同的 URL 生成不同的内容 (访问除根目录的其他任何 path 该脚本都会返回一个错误页面).

更有扩展性的 HTTP 框架请参阅 SimpleHTTPServer  CGIHTTPServer 模块.

 

7.20. SimpleHTTPServer 模块

SimpleHTTPServer 模块是一个简单的 HTTP 服务器它提供了标准的 GET 和 HEAD 请求处理器客户端请求的路径名称会被翻译为一个相对文件名 (相对于服务器启动时的当前路径).

这个服务器会忽略驱动器符号和相对路径名(例如 `..`). 但它并没有任何访问验证处理所以请小心使用.

 

7.21. CGIHTTPServer 模块

CGIHTTPServer 模块是一个可以通过公共网关接口( common gateway interface , CGI )调用外部脚本的 HTTP 服务器

 

7.22. cgi 模块

cgi 模块为 CGI 脚本提供了函数和类支持它还可以处理 CGI 表单数据.

 

7.23. webbrowser 模块

(2.0 中新增webbrowser 模块提供了一个到系统标准 web 浏览器的接口它提供了一个 open 函数接受文件名或 URL 作为参数然后在浏览器中打开它如果你又一次调用 open 函数那么它会尝试在相同的窗口打开新页面

在 Unix 该模块支持 lynx , Netscape , Mosaic , Konquerer , 和 Grail . 在 Windows 和 Macintosh 它会调用标准浏览器 (在注册表或是 Internet 选项面板中定义).

 

8. 国际化

 

8.1. locale 模块

locale 模块提供了 本地化( localization )函数的接口同时提供相关函数实现基于当前 locale 设置的数字字符串转换. ( int ,float , 以及 string 模块中的相关转换函数不受 locale 设置的影响.)

 

8.2. unicodedata 模块

( 2.0 中新增unicodedata 模块包含了 Unicode 字符的属性例如字符类别分解数据以及数值

 

8.3. ucnhash 模块

(仅适用于 2.0 ) ucnhash 模块为一些 Unicode 字符代码提供了特定的命名你可以直接使用 /N{} 转义符将 Unicode 字符名称映射到字符代码上

 

9. 多媒体相关模块

"Wot? No quote?"

- Guido van Rossum

 

9.1. 概览

Python 提供了一些用于处理图片和音频文件的模块.

另请参阅 Pythonware Image Library ( PIL , http://www.pythonware.com/products/pil/ ), 以及 PythonWare Sound Toolkit (PST ,http://www.pythonware.com/products/pst/ ).

译注别参阅 PST 废了 pymedia 代替吧.

 

9.2. imghdr 模块

imghdr 模块可识别不同格式的图片文件当前版本可以识别 bmp , gif , jpeg , pbm , pgm , png , ppm , rast (Sun raster), rgb (SGI), tiff , 以及 xbm图像

 

 

9.3. sndhdr 模块

sndhdr 模块可来识别不同的音频文件格式并提取文件内容相关信息.执行成功后what 函数将返回一个由文件类型采样频率声道数音轨数和每个采样点位数组成的元组具体含义请参考 help(sndhdr) .

 

9.4. whatsound 模块

(已废弃whatsound  sndhdr 模块的一个别名

 

9.5. aifc 模块

aifc 模块用于读写 AIFF 和 AIFC 音频文件(在 SGI 和 Macintosh 的计算机上使用). 

 

9.6. sunau 模块

sunau 模块用于读写 Sun AU 音频文件

 

9.7. sunaudio 模块

sunaudio 模块用于识别 Sun AU 音频文件并提取其基本信息sunau 模块为 Sun AU 文件提供了更完成的支持如 Example 9-6 所示

 

9.8. wave 模块

wave 模块用于读写 Microsoft WAV 音频文件.

 

9.9. audiodev 模块

(只用于 Unix) audiodev 为 Sun 和 SGI 计算机提供了音频播放支持.

 

9.10. winsound 模块

(只用于 Windows ) winsound 模块允许你在 Winodws 平台上播放 Wave 文件 Example 9-9 所示.

flag 变量说明:

  • SND_FILENAME - sound 是一个 wav 文件名
  • SND_ALIAS - sound 是一个注册表中指定的别名
  • SND_LOOP - 重复播放直到下一次 PlaySound ; 必须指定 SND_ASYNC
  • SND_MEMORY - sound 是一个 wav 文件的内存映像
  • SND_PURGE - 停止指定 sound 的所有实例
  • SND_ASYNC - 异步播放声音声音开始播放后函数立即返回
  • SND_NODEFAULT - 找不到 sound 时不播放默认的 beep 声音
  • SND_NOSTOP - 不打断当前播放中的任何 sound
  • SND_NOWAIT - sound 驱动忙时立即返回

 

10. 数据储存

"Unlike mainstream component programming, scripts usually do not introduce new components but simply ‘wire‘ existing ones. Scripts can be seen as introducing behavior but no new state ... Of course, there is nothing to stop a ‘scripting‘ language from introducing persistent state — it then simply turns into a normal programming language."

- Clemens Szyperski, in Component Software

 

10.1. 概览

Python 提供了多种相似数据库管理( database manager )的驱动它们的模型都基于 Unix  dbm 这些数据库和普通的字典对象类似但这里需要注意的是它只能接受字符串作为键和值. ( shelve 模块可以处理任何类型的值)

 

10.2. anydbm 模块

anydbm 模块为简单数据库驱动提供了统一标准的接口.

当第一次被导入的时候anydbm 模块会自动寻找一个合适的数据库驱动按照 dbhash , gdbm , dbm ,  dumbdbm 的顺序尝试如果没有找到任何模块它将引发一个 ImportError 异常.

open 函数用于打开或创建一个数据库(使用导入时找到的数据库驱动), 

 

10.3. whichdb 模块

whichdb 模块可以判断给定数据库文件的格式

10.4. shelve 模块

shelve 模块使用数据库驱动实现了字典对象的持久保存shelve 对象使用字符串作为键但值可以是任意类型所有可以被 pickle 模块处理的对象都可以作为它的值

 

10.5. dbhash 模块

(可选dbhash 模块为 bsddb 数据库驱动提供了一个 dbm 兼容的接口.

 

10.6. dbm 模块

(可选dbm 模块提供了一个到 dbm 数据库驱动的接口(在许多 Unix 平台上都可用).  Example 10-6 所示.

 

10.7. dumbdbm 模块

dumbdbm 模块是一个简单的数据库实现 dbm 一类相似但使用纯 Python 实现它使用两个文件一个二进制文件 (.dat) 用于储存数据一个文本文件 (.dir) 用于数据描述.

 

10.8. gdbm 模块

(可选gdbm 模块提供了到 GNU dbm 数据驱动的接口

 

11. 工具和实用程序

标准库中有一些模块既可用作模块又可以作为命令行实用程序.

 

11.1. dis 模块

dis 模块是 Python 的反汇编器它可以把字节码转换为更容易让人看懂的格式.

你可以从命令行调用反汇编器它会编译给定的脚本并把反汇编后的字节代码输出到终端上:

$ dis.py hello.py 0 SET_LINENO 0 3 SET_LINENO 1 6 LOAD_CONST 0 (‘hello again, and welcome to the show‘) 9 PRINT_ITEM 10 PRINT_NEWLINE 11 LOAD_CONST 1 (None) 14 RETURN_VALUE

当然 dis 也可以作为模块使用dis 函数接受一个类方法函数或者 code 对象 作为单个参数

 

11.2. pdb 模块

pdb 模块是标准 Python 调试器( debugger ). 它基于 bdb 调试器框架.

你可以从命令行调用调试器 (键入 或 进入下一行代码键入 help 获得可用命令列表):

$ pdb.py hello.py > hello.py(0)?() (Pdb) n > hello.py() (Pdb) n hello again, and welcome to the show --Return-- > hello.py(1)?()->None (Pdb)

 

11.3. bdb 模块

bdb 模块为提供了一个调试器框架你可以使用它来创建自定义的调试器你需要做的只是继承 Bdb 覆盖它的 user 方法(在每次调试器停止的时候被调用). 使用各种各样的 set 方法可以控制调试器.

 

11.4. profile 模块

profile 模块是标准 Python 分析器.

和反汇编器调试器相同你可以从命令行调用分析器:

$ profile.py hello.py hello again, and welcome to the show 3 function calls in 0.785 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 0.002 0.002 <string>:1(?) 1 0.001 0.001 0.001 0.001 hello.py:1(?) 1 0.783 0.783 0.785 0.785 profile:0(execfile(‘hello.py‘)) 0 0.000 0.000 profile:0(profiler)

我们还可以从程序中调用 profile 来对程序性能做分析.

你可以使用 pstats 模块来修改结果报告的形式.

 

11.5. pstats 模块

pstats 模块用于分析 Python 分析器收集的数据

 

11.6. tabnanny 模块

(2.0 新增tabnanny 模块用于检查 Python 源文件中的含糊的缩进当文件混合了 tab 和空格两种缩进时候, nanny (保姆)会立即给出提示.

在下边使用的 badtabs.py 文件中, if 语句后的第一行使用 个空格和 个 tab . 第二行只使用了空格.

$ tabnanny.py -v samples/badtabs.py ‘;samples/badtabs.py‘: *** Line 3: trouble in tab city! *** offending line: print "world" indent not equal e.g. at tab sizes 1, 2, 3, 5, 6, 7, 9

因为 Python 解释器把 tab 作为 个空格来处理所以这个脚本可以正常运行在所有符合代码标准(一个 tab 为 个空格)的编辑器中它也会正常显示当然这些都骗不过 nanny .

 sys.stdout 重定向到一个 StringIO 对象就可以捕获输出.

 

12. 其他模块

 

12.1. 概览

本章介绍了一些平台相关的模块重点放在了适用于整个平台家族的模块上. (比如 Unix , Windows 家族)

 

12.2. fcntl 模块

(只用于 Unix) fcntl 模块为 Unix上的 ioctl  fcntl 函数提供了一个接口它们用于文件句柄和 I/O 设备句柄的 "out of band" 操作包括读取扩展属性控制阻塞更改终端行为等等. (out of band management: 指使用分离的渠道进行设备管理这使系统管理员能在机器关机的时候对服务器网络进行监视和管理出处http://en.wikipedia.org/wiki/Out-of-band_management )

关于如何在平台上使用这些函数请查阅对应的 Unix man 手册.

该模块同时提供了 Unix 文件锁定机制的接口输出结果是由同时运行 个副本得到的像这样(都在一句命令行里):

python fcntl-example-1.py& python fcntl-example-1.py& python fcntl-example-1.py&

如果你注释掉对 flock 的调用那么 counter 文件不会正确地更新.

 

12.3. pwd 模块

(只用于 Unix) pwd 提供了一个到 Unix 密码/password "数据库"( /etc/passwd 以及相关文件 )的接口这个数据库(一般是一个纯文本文件)包含本地机器用户账户的信息.

getpwall 函数返回一个包含所有可用用户数据库入口的列表你可以使用它搜索一个用户.

当需要查询很多名称的时候你可以使用 getpwall 来预加载一个字典,

 

12.4. grp 模块

(只用于 Unix) grp 模块提供了一个到 Unix 用户组/group ( /etc/group )数据库的接口getgrgid 函数返回给定用户组 id 的相关数据,getgrnam 返回给定用户组名称的相关数据.

getgrall 函数返回包含所有可用用户组数据库入口的列表.

如果需要执行很多用户组查询你可以使用 getgrall 来把当前所有的用户组复制到一个字典里这可以节省一些时间

 

12.5. nis 模块

 

12.6. curses 模块

 

12.7. termios 模块

(只用于 Unix , 可选termios 为 Unix 的终端控制设备提供了一个接口它可用于控制终端通讯端口的大多方面.

 

12.8. tty 模块

(只用于 Unix) tty 模块包含一些用于处理 tty 设备的工具函数.

 

12.9. resource 模块

(只用于 Unix , 可选resource 模块用于查询或修改当前系统资源限制设置

 

12.10. syslog 模块

(只用于 Unix 可选) syslog 模块用于向系统日志设备发送信息( syslogd ). 这些信息如何处理依不同的系统而定通常会被记录在一个 log 文件中例如/var/log/messages , /var/adm/syslog , 或者其他类似处理. (如果你找不到这个文件请联系你的系统管理员). 

 

12.11. msvcrt 模块

(只用于 Windows/DOS ) msvcrt 模块用于访问 Microsoft Visual C/C++ Runtime Library (MSVCRT) 中函数的方法.

 

12.12. nt 模块

(非直接使用模块只用于 Windows ) nt 模块是 os 模块在 Windows 平台下调用的执行模块几乎没有任何原因直接使用这个模块请使用 os 模块替代.

 

12.13. _winreg 模块

(只用于 Windows , 2.0 中新增_winreg 模块提供了访问 Windows 注册表数据库的一个基本接口

 

12.14. posix 模块

(非直接使用模块只用于 Unix/POSIX ) posix 模块是 os 模块在 Unix 及其他 POSIX 系统下使用的实现模块一般只需要通过 os 模块访问它即可

 

13. 执行支持模块

就是其他模块中用到的模块.

 

13.1. dospath 模块

dospath 模块提供了 DOS 平台下的 os.path 功能你可以使用它在其他平台处理 DOS 路径.

注意 Python 的 DOS 支持可以使用斜杠和反斜杠作为目录分隔符.

 

13.2. macpath 模块

macpath 模块提供了 Macintosh 平台下的 os.path 功能你也可以使用它在其他平台处理 Macintosh 路径.

 

13.3. ntpath 模块

ntpath 模块提供了 Windows 平台下的 os.path 功能你也可以使用它在其他平台处理 Windows 路径.

注意该模块可以同时使用斜杠和反斜杠作为目录分隔符.

 

13.4. posixpath 模块

posixpath 模块提供了 Unix 和其他 POSIX 兼容平台下的 os.path 功能你也可以使用它在其他平台处理 POSIX 路径另外它也可以处理 URL .

 

13.5. strop 模块

(已废弃strop  string 模块中的大多函数提供了底层 语言实现string 模块会自动调用它所以一般你不需要直接使用它.

不过在导入 Python 模块之前处理路径的时候你可能会用到它在 Python 2.0 及以后版本中你应该使用字符串方法代替 strop , 例如在上边的代码中使用 "sys.executable.lower()" 替换 "strop.lower(sys.executable)" .

 

13.6. imp 模块

imp 模块包含的函数可以用于实现自定义的 import 行为注意这里的导入功能不支持包具体实现请参阅 knee 模块的源代码.

 

13.7. new 模块

new 模块是一个底层的模块你可以使用它来创建不同的内建对象例如类对象函数对象以及其他由 Python 运行时系统创建的类型如果你使用的是 1.5.2 版本 那么你有可能需要重新编译 Python 来使用这个模块在默认情况下并不是所有平台都有这个模块在 2.0 及以后版本中不需要这么做.

 

13.8. pre 模块

(已废弃pre 模块是 1.5.2  re 模块调用的实现功能模块在当前版本中已废弃

 

13.9. sre 模块

(功能实现模块已声明不支持sre 模块是 re 模块的底层实现一般没必要直接使用它而且以后版本将不会支持它

 

13.10. py_compile 模块

py_compile 模块用于将 Python 模块编译为字节代码它和 Python 的 import 语句行为类似不过它接受文件名而不是模块名作为参数compileall 模块可以把一个目录树下的所有 Python 文件编译为字节代码.

 

13.11. compileall 模块

compileall 模块用于将给定目录下(以及 Python path )的所有 Python 脚本编译为字节代码它也可以作为可执行脚本使用(在 Unix 系统下, Python 安装时会自动调用执行它). 

 

13.12. ihooks 模块

ihooks 模块为替换导入提供了一个框架这允许多个导入机制共存

 

13.13. linecache 模块

linecache 模块用于从模块源文件中读取代码它会缓存最近访问的模块 (整个源文件). 

traceback 模块使用这个模块实现了对导入操作的跟踪.

 

13.14. macurl2path 模块

(功能实现模块macurl2path 模块用于 URL 和 Macintosh 文件名 的相互映射一般没有必要直接使用它请使用 urllib 中的机制.

 

13.15. nturl2path 模块

(功能实现模块nturl2path 模块用于 URL 和 Windows 文件名的 相互映射

 

13.16. tokenize 模块

tokenize 模块将一段 Python 源文件分割成不同的 token . 你可以在代码高亮工具中使用它.

注意这里的 tokenize 函数接受两个可调用对象作为参数前一个用于获取新的代码行第二个用于在获得每个 token 时调用.

 

13.17. keyword 模块

keyword 模块有一个包含当前 Python 版本所使用的关键字的列表它还提供了一个字典以关键字作为 key , 以一个描述性函数作为 value , 它可用于检查 给定单词是否是 Python 关键字.

 

13.18. parser 模块

(可选parser 模块提供了一个到 Python 内建语法分析器和编译器的接口.

 

13.19. symbol 模块

symbol 模块包含 Python 语法中的非终止符号可能只有你涉及 parser 模块的时候用到它

 

13.20. token 模块

token 模块包含标准 Python tokenizer 所使用的 token 标记

 

14. 其他模块

 

14.1. 概览

本章描述的是一些并不怎么常见的模块一些是很实用的另些是已经废弃的模块.

 

14.2. pyclbr 模块

pyclbr 模块包含一个基本的 Python 类解析器.

版本 1.5.2 改模块只包含一个 readmodule 函数解析给定模块返回一个模块所有顶层类组成的列表.

访问类实例的属性可以获得关于类的更多信息, .

 

14.3. filecmp 模块

( 2.0 新增filecmp 模块用于比较文件和目录

1.5.2 以及先前版本中你可以使用 cmp  dircmp 模块代替.

 

14.4. cmd 模块

cmd 模块为命令行接口( command-line interfaces , CLI )提供了一个简单的框架它被用在 pdb 模块中当然你也可以在自己的程序中使用它

你只需要继承 Cmd 定义 do  help 方法基类会自动地将这些方法转换为对应命令.

 

14.5. rexec 模块

Feather 版本 2.3 时取消了改模块的支持具体原因请参阅 http://www.amk.ca/python/howto/rexec/  http://mail.python.org/pipermail/python-dev/2002-December/031160.html

解决方法请参阅http://mail.python.org/pipermail/python-list/2003-November/234581.html

rexec 模块提供了在限制环境下的 exec , eval , 以及 import 语句在这个环境下所有可能对机器造成威胁的函数都不可用.

 

14.6. Bastion 模块

Feather 版本 2.3 时取消了改模块的支持具体原因请参阅 http://www.amk.ca/python/howto/rexec/  http://mail.python.org/pipermail/python-dev/2003-January/031848.html

Bastion 模块允许你控制给定对象如何使用,  你可以通过它把对象从未限制部分传递到限制部分.

默认情况下所有的实例变量都是隐藏的所有的方法以下划线开头.

 

14.7. readline 模块

(可选readline 模块使用 GNU readline (或兼容库)实现了 Unix 下增强的输入编辑支持

该模块提供了增强的命令行编辑功能例如命令行历史等它还增强了 input  raw_input 函数.

 

14.8. rlcompleter 模块

(可选只用于 Unix ) rlcompleter 模块为 readline 模块提供了单词自动完成功能.

导入该模块就可以启动自动完成功能默认情况下完成函数被绑定在了 Esc 键上按两次 Esc 键就可以自动完成当前单词你可以使用下面的代码修改所绑定的键:

import readline readline.parse_and_bind("tab: complete")

 

14.9. statvfs 模块

statvfs 模块包含一些与 os.statvfs (可选)函数配合使用的常量和函数该函数会返回文件系统的相关信息

 

14.10. calendar 模块

calendar 模块是 Unix cal 命令的 Python 实现它可以将给定年份/月份的日历输出到标准输出设备上.

prmonth(year, month) 打印给定月份的日历

 

14.11. sched 模块

sched 模块为非线程环境提供了一个简单的计划任务模式.

 

14.12. statcache 模块

statcache 模块提供了访问文件相关信息的相关函数它是 os.stat 的扩展模块而且它会缓存收集到的信息

2.2 后该模块被废弃请使用 os.stat() 函数代替原因很简单它导致了更复杂的缓存管理反而降低了性能.

 

14.13. grep 模块

grep 模块提供了在文本文件中搜索字符串的另种方法版本 2.1 时被声明不支持及就是说当前版本已经无法使用该模块.

 

14.14. dircache 模块

(已经废弃 statcache 类似该模块是 os.listdir 函数的一个扩展提供了缓存支持可能因为同样的原因被废弃吧~ MUHAHAHAHAHA~~~~ . 请使用 os.listdir 代替

 

14.15. dircmp 模块

(已废弃只用于 1.5.2) dircmp 模块用于比较两个目录的内容Python 2.0 该模块被 filecmp 替换.

 

14.16. cmp 模块

(已废弃只用于 1.5.2) cmp 模块用于比较两个文件,.

Python 2.0 该模块被 filecmp 替换.

 

14.17. cmpcache 模块

(已废弃只用于 1.5.2) cmpcache 模块用于比较两个文件它是 cmp 模块的扩展提供了缓存支持

Python 2.0 该模块被 filecmp 替换.

 filecmp 已经不提供缓存支持.

 

14.18. util 模块

(已废弃只用于 1.5.2) util 模块提供了常见操作的封装函数新代码可以使用如 Examples 14-21 到 14-23 的实现方法.

 

14.19. soundex 模块

(已废弃只用于 1.5.2) soundex 实现了一个简单的 hash 算法基于英文发音将单词转换为 个字符的字符串.

版本 2.0 该模块已从标准库中删除.

get_soundex(word) 返回给定单词的 soundex 字符串sound_similar(word1, word2) 判断两个单词的 soundex 是否相同一般说来发音相似的单词有相同的 soundex . 

 

14.20. timing 模块

(已废弃只用于 Unix ) timing 用于监控 Python 程序的执行时间time.clock() 可以替换 time.time() 获得 CPU 时间.

 

14.21. posixfile 模块

(已废弃只用于 Unix ) posixfile 提供了一个类文件的对象( file-like object ), 实现了文件锁定的支持新程序请使用 fcntl 模块代替.

 

14.22. bisect 模块

bisect 模块用于向排序后的序列插入对象.

insort(sequence, item) 将条目插入到序列中并且保证序列的排序序列可以是任意实现了 _ _getitem_ _  insert 方法的序列对象

bisect(sequence, item) => index 返回条目插入后的索引值不对序列做任何修改

 

14.23. knee 模块

knee 模块用于 Python 1.5 中导入包( package import )的实现当然 Python 解释器已经支持了这个所以这个模块几乎没有什么作用不过你可以看看它的代码明白这一切是怎么完成的.

代码请参见 Python-X.tgz/Python-2.4.4/Demo/imputil/knee.py

当然你可以导入该模块,

 

14.24. tzparse 模块

(已废弃tzparse 模块用于解析时区标志( time zone specification ). 导入时它会自动分析 TZ 环境变量

除了这些变量之外该模块还提供了一些用于时间计算的函数.

 

14.25. regex 模块

(已废弃regex 模块是旧版本的(1.5 )正则表达式模块,新代码请使用 re 模块实现.

注意在 Python 1.5.2  regex  re 模块要快但在新版本中 re 模块更快.

 

14.26. regsub 模块

(已废弃regsub 模块提供了基于正则表达式的字符串替换操作新代码请使用 re 模块中的 replace 函数代替.

 

14.27. reconvert 模块

(已废弃reconvert 提供了旧样式正则表达式regex 模块中使用)到新样式re 模块)的转换工具它也可以作为一个命令行工具.

 

14.28. regex_syntax 模块

(已废弃regex_syntax 模块用于改变正则表达式的模式.

 

14.29. find 模块

(已废弃只用于 1.5.2) find 模块用于在给定目录及其子目录中查找符合给定匹配模式的文件

匹配模式的语法与 fnmatch 中相同.

 

python 各模块学习