Python 标准库. t- I* C. A$ d5 D, V* Q* p- D
简介
# X0 C9 f' r( [3 S9 K+ `Python 标准库是随 Python 附带安装的,它包含大量极其有用的模块。熟悉 Python 标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题都可以简单快捷地使用它们来解决。( }1 u% n, t. z+ q% s1 X
/ p, H7 Z) j- i3 ?8 C我们已经研究了一些这个库中的常用模块。你可以在 Python 附带安装的文档的“库参考”一节中了解 Python 标准库中所有模块的完整内容。
" h# m* M( G! |/ p" V
4 Z( N! p N& n8 e1 Zsys 模块
) I1 T# u3 ]- G3 l& M7 G1 Psys 模块包含系统对应的功能。我们已经学习了 sys.argv 列表,它包含命令行参数。# X: ]2 C( N8 v$ M* ]- e/ ^
( d; D N- Z9 v6 T/ L命令行参数" v% x. K4 C2 i& [( y- g2 F. }! e
例 14.1 使用 sys.argv# i+ ^8 q) b. I3 X- Q
- #!/usr/bin/python
! N+ Q! Z( g2 j0 ^( B% {
; h( a# ?# O' j5 t1 p- # Filename: cat.py6 Q0 c" r1 F O, p7 k# N1 ^ b/ h2 @
; j2 s$ o; }& @2 ~2 {3 m, ?' }- / ?/ b7 z$ |; p
9 h& j7 J5 f- h4 {1 t* A- import sys
. L+ O1 \& h. M7 K3 }: b; ^! H5 t - + N. g- a6 `3 R% N4 M4 [' R2 _% u0 E
- 8 n$ R- q" E' z+ D# C
- 4 x& F7 }6 m; N1 y( @
- def readfile(filename):
8 O; y3 l8 _, F0 o0 b/ y - 5 `" P9 x3 }! J' R& }& `
- '''Print a file to the standard output.'''- l& @* o$ U, Y* X2 K1 `. f
- q& N5 {+ o: f. g+ B" @- f = file(filename)
6 X' q- ^# S! t) o; ?
% v( g& Q; e+ A0 U, x/ l- while True:
9 a7 T1 Q& Z0 v - % } J0 o0 G% ?" G8 y
- line = f.readline()
/ l! J) L6 N, C1 G& y# w - & A, L8 ~0 O) f' B) b% ^
- if len(line) == 0:6 d+ L4 d1 e5 O0 B0 i% N
- ; ]* q9 e6 n1 u, C" P
- break
5 g0 ^1 e- W' ` - ) M' C0 @$ i8 u) B+ u! `+ }
- print line, # notice comma0 I6 w, ?- l2 q5 W) u1 \. Y
5 F5 ^/ ^5 J) W2 J+ J1 l+ }: A$ t- f.close() S; o$ n* ~2 r |7 @
, L r- r$ K$ K& K$ V% y1 n
- J& `( T/ S2 I; b2 T/ v1 M- ) N1 G4 Q% c. c/ F4 p p Y. \" P' i
- # Script starts from here0 [* x8 K7 M7 I$ N$ T
+ [( U( U0 s2 H0 \# E t6 Z ]- if len(sys.argv) < 2:
( o4 u- G1 F ]* l' w - 4 r* j$ U: S) h9 g6 {) e
- print 'No action specified.'2 I3 L. x$ M4 e, c C$ C5 y
5 X# R, G" `* L- d7 O- sys.exit()
: |; {2 a1 ` U9 n( S( }0 g9 ` - . }% [8 x q. M7 y5 |( e2 W
- 1 m8 ^2 g& v7 m$ {2 n% c: R: E; L. j
6 |* `" s: T& S) U+ o* e- if sys.argv[1].startswith('--'):1 ?' ~, J8 j; X7 Q
- ' U: C. ^4 W- {9 X; J5 N
- option = sys.argv[1][2:]
' {( @- s/ J$ r/ p0 ^0 N
. _+ ]% j. u+ x* `- # fetch sys.argv[1] but without the first two characters
4 F+ F5 [* }) q" {" i6 b4 }' c0 N - . r) S7 J0 q. Z# _
- if option == 'version':
0 _/ I6 N: f( m4 [ - 3 K# H; r1 @' ?* w
- print 'Version 1.2'
. K* {( N* A. W; r. C5 c. F
% O. }2 [. N9 O; `+ v9 _' q* R- elif option == 'help':" u( w9 i4 }+ x- q1 u
7 G2 z8 x# F0 F2 ]. [- print '''\3 q: ^7 u3 n, X- j& B$ f3 q! Y
- f2 N* ?. O9 n. [
- This program prints files to the standard output.
$ a6 ?% T+ ?& y9 {% p/ U0 q
. G4 p. B/ _- f3 e- Any number of files can be specified.
( j C$ e9 o6 e+ e: i - ) y+ \- m6 L# W7 K! z, S
- Options include:8 v9 I: d) c" J' D/ y8 V
( M% K: Y7 ~/ D/ |9 G% x- --version : Prints the version number$ k0 B' u5 B, ^1 b+ g) P
$ C! O5 J6 S" ~1 C8 X3 P! g$ z" H- --help: Display this help'''' `6 s- h) a) ?3 P( P, h
( i7 y* x2 f2 ]0 G& z- else:
$ r8 C7 c) a D5 M1 X
5 ^% y! i% A% i: }8 d- print 'Unknown option.'. G4 P7 y; b3 w
' Q. u/ y9 d( O# V9 Y) z- sys.exit()
/ ?8 `8 U3 ~$ F- g. K- j. K6 s" @ - ' {) L/ Q' e2 q/ t5 a" G9 a
- else:0 P2 w* T8 S) ~! a' q% K
- $ L1 S2 H3 t0 P* o
- for filename in sys.argv[1:]:6 f2 {" ]. @; f) s
- ; ?* P6 g, X5 _- d) }2 _
- readfile(filename)
复制代码 1 } `/ m+ ? D+ A$ e, {
输出
1 o: b; I- F/ ]3 t( n2 T+ T, O
" v( j: K2 ?2 l0 v6 e - $ python cat.py
8 D& X V4 E- D - No action specified.
# [2 Y4 [2 E9 W- ]( K
' x% P: T4 w8 I9 z& S6 t6 e- $ python cat.py --help" f9 \9 b0 R* t1 |/ j6 a8 b
- This program prints files to the standard output.5 j& L% A/ N3 x/ _
- Any number of files can be specified.% ~+ a, R: k7 r' T
- Options include:
% Z) w8 S+ R0 A# y% G: n9 x2 c% E - --version : Prints the version number; s- ]" ~ \- `, u3 n% E
- --help : Display this help
& Y$ w% P( z( |* P
) r, D! c( I+ v% f n; n' N# G6 T: `- $ python cat.py --version
) e2 Q2 r8 `7 q6 Y: z3 G - Version 1.2$ [/ K7 f4 D- m- `
- 5 M% h* X9 z0 j9 f
- $ python cat.py --nonsense( |: h/ x# ~- t5 F7 K3 N
- Unknown option.
3 S0 o! X. F1 b. @8 k3 r4 n- p
# J* q L# x/ y& x$ B, R- $ python cat.py poem.txt
( a) Q; I! F( d0 i: a - Programming is fun
$ A9 ~" w2 t7 h' A" K9 \* m. v2 N - When the work is done
9 M- P6 i( e4 n2 Z& ^3 f - if you wanna make your work also fun:
/ _9 o2 P. B' C( B+ o) g - use Python!
复制代码
- R9 j% X0 l0 R, y( q它如何工作5 S. L$ J" j2 g3 o
# x8 h$ n4 n3 }8 y* w- ~, U
这个程序用来模范 Linux/Unix 用户熟悉的 cat 命令。你只需要指明某些文本文件的名字,这个程序会把它们打印输出。
" t/ `* Q' P$ u. E% O
% d5 G$ U n6 d4 T在 Python 程序运行的时候,即不是在交互模式下,在 sys.argv 列表中总是至少有一个项目。它就是当前运行的程序名称,作为 sys.argv[0](由于 Python 从 0 开始计数)。其他的命令行参数在这个项目之后。3 T8 o) z- [) _% |, {5 E4 q# s+ b/ j
1 [" j* e6 k/ }为了使这个程序对用户更加友好,我们提供了一些用户可以指定的选项来了解更多程序的内容。我们使用第一个参数来检验我们的程序是否被指定了选项。如果使用了--version 选项,程序的版本号将被打印出来。类似地,如果指定了--help 选项,我们提供一些关于程序的解释。我们使用 sys.exit 函数退出正在运行的程序。和以往一样,你可以看一下 help(sys.exit)来了解更多详情。1 }' x7 H9 @$ I a$ u2 z/ ~
; R9 j. s, _# h! X
如果没有指定任何选项,而是为程序提供文件名的话,它就简单地打印出每个文件地每一行,按照命令行中的顺序一个文件接着一个文件地打印。
* n' r/ D+ ^, G, B% {; y# ]1 s: X; H" E: ~$ C
顺便说一下,名称 cat 是 concatenate 的缩写,它基本上表明了程序的功能——它可以在输出打印一个文件或者把两个或两个以上文件连接/级连在一起打印。; _2 \$ Z' L6 i' L$ _7 r
9 B# |9 U. g$ a5 p4 U# c& n更多 sys 的内容
0 E3 L" x9 k# y; K$ Isys.version 字符串给你提供安装的 Python 的版本信息。sys.version_info 元组则提供一个更简单的方法来使你的程序具备 Python 版本要求功能。5 p( Y( S" \( H$ m7 w: h
+ q7 P% a' _7 g/ N8 B* O- [swaroop@localhost code]$ python
) v& C! {, ?% t, n% n( x- p3 K - >>> import sys7 G* x- M5 l# v/ y, Y- Z+ h; s
- >>> sys.version7 j2 Q5 q- Z' n
- '2.3.4 (#1, Oct 26 2004, 16:42:40) \n[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)]'
* h" p, U! K" }6 k - >>> sys.version_info5 P8 D* t& k7 B- B6 B0 }
- (2, 3, 4, 'final', 0)
复制代码
6 _* V0 [5 f9 p& i对于有经验的程序员,sys 模块中其他令人感兴趣的项目有 sys.stdin、sys.stdout 和 sys.stderr 它们分别对应你的程序的标准输入、标准输出和标准错误流。
% M# ]1 D! c: E* y6 j
+ [4 c& i* n( ^os 模块2 V* _8 w/ }8 j' B$ G j. v
这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在 Linux 和 Windows 下运行。一个例子就是使用 os.sep 可以取代操作系统特定的路径分割符。
4 f& p, s) M2 m: b( J5 r" g
" @9 p1 d/ ~ k3 x. B下面列出了一些在 os 模块中比较有用的部分。它们中的大多数都简单明了。
+ [" L/ s+ n. G+ F! ~& F7 Y$ E$ y" K& z7 j, i9 S8 U8 O
os.name 字符串指示你正在使用的平台。比如对于 Windows,它是'nt',而对于 Linux/Unix 用户,它是'posix'。# u* S+ J1 F# j3 S4 a% M$ {
5 |1 j. e5 D' u. d* q& Y
os.getcwd()函数得到当前工作目录,即当前 Python 脚本工作的目录路径。
4 ^$ g$ f9 ?& {+ O
9 p0 s2 Z0 v0 J/ uos.getenv()和 os.putenv()函数分别用来读取和设置环境变量。
# [8 x6 W* X6 j# o0 u. j+ I
" M4 J6 h7 A% [' ~( M3 ^os.listdir()返回指定目录下的所有文件和目录名。! J$ y4 v; {- J5 K9 r
2 l- X4 a6 z+ y/ n6 g$ B, hos.remove()函数用来删除一个文件。2 g- h% f) T" k) ~/ U" e) u
8 ~5 j# M6 H9 n' K: b3 B5 o
os.system()函数用来运行 shell 命令。
3 |- B% S* `- P# D3 L( U7 e5 e/ q" ?! B2 T. _
os.linesep 字符串给出当前平台使用的行终止符。例如,Windows 使用'\r\n',Linux 使用'\n'而 Mac 使用'\r'。( ]- d& D' p7 w% u n& m6 u7 n
; ?" c7 E6 ]8 ]/ J( r4 R( p7 S
os.path.split()函数返回一个路径的目录名和文件名。- _3 G N$ S& y: W% p
; l% `2 f8 r9 ~+ I
- >>> os.path.split('/home/swaroop/byte/code/poem.txt')# t4 t4 d: g, p. V- |
- ('/home/swaroop/byte/code', 'poem.txt')
复制代码
) F( W- z9 u2 ?) ~, y/ vos.path.isfile()和 os.path.isdir()函数分别检验给出的路径是一个文件还是目录。类似地,os.path.existe()函数用来检验给出的路径是否真地存在。
# C5 |2 c6 B- y9 h6 u% a你可以利用 Python 标准文档去探索更多有关这些函数和变量的详细知识。你也可以使用 help(sys)等等。3 n" N4 h- R1 ]
1 F6 G; B4 \' C# p
概括
! e& z' y1 T( L; K3 n8 c" h我们已经学习了 Python 标准库中的 sys 模块和 os 模块的一部分功能。你应该利用 Python 标准文档去学习这两个模块以及其他模块的更多内容。$ G/ G8 O3 s% f9 e& Z2 }
: R- z8 }4 Y7 ?$ K5 _# S- x) h接下来,我们将要学习 Python 中剩余的几个方面的内容,从而使我们的 Python 课程更加 完整 。
( i" @9 l7 r# z. `1 |6 [
1 K1 i5 N% u! N2 \ |