输入/输出
) j2 C3 u; T+ C# I6 R& I% S* |在很多时候,你会想要让你的程序与用户(可能是你自己)交互。你会从用户那里得到输入,然后打印一些结果。我们可以分别使用 raw_input 和 print 语句来完成这些功能。对于输出,你也可以使用多种多样的 str(字符串)类。例如,你能够使用 rjust 方法来得到一个按一定宽度右对齐的字符串。利用 help(str)获得更多详情。) ?$ m: c& Z$ t4 \$ Y; }
7 U% l& d5 U# X5 R; D
另一个常用的输入/输出类型是处理文件。创建、读和写文件的能力是许多程序所必需的,我们将会在这章探索如何实现这些功能。
W/ R* n, `, ?4 k7 i+ X# x1 v# H1 W2 e3 r
文件
@- ?$ ^! m" V你可以通过创建一个 file 类的对象来打开一个文件,分别使用 file 类的 read、readline 或 write 方法来恰当地读写文件。对文件的读写能力依赖于你在打开文件时指定的模式。最后,当你完成对文件的操作的时候,你调用 close 方法来告诉 Python 我们完成了对文件的使用。/ r3 a) q& E; C* M9 j4 w+ v
9 M' A+ p- @& V9 _
使用文件$ b. E: U% _- L* ^) ~* h
例 12.1 使用文件
5 V; s' A! v p* o2 l- z7 Z- T" ~3 N, g1 U( `9 n/ G
8 [; a9 d" G( B& G0 e& m* Z+ J- #!/usr/bin/python5 v$ I M* f# [' a$ \
$ h5 E. T, t" F- # Filename: using_file.py
( C/ ]0 E; m3 O$ c8 H - 7 }: j& p+ i) p$ K! ]0 {! N
- ) \- g8 c5 Z j( s' f% U3 S
- - y1 l- Z7 D6 R
- poem = '''\5 c# I1 }1 H* v( F
0 C8 \ _& M- @5 L* b% V- D# u- Programming is fun! N! P \/ f- [* C! b
4 D% O& K8 ]4 {4 b8 t5 J7 K( j- When the work is done7 F* h+ }: c* [% d
4 z% C9 t, r' n# @9 ]0 k; v$ X- if you wanna make your work also fun:
5 c4 R9 b+ i/ P8 @! M - * J. ]0 p+ V9 d4 ~; @9 J
- use Python!- F7 Y, m# }5 `$ J3 ?( Q$ t7 n
- - G% h- B, x$ r! S$ F1 q
- '''
_. j+ `- L5 y
5 U/ u, h) }! _+ D# F% ^- q" H& n
% t( f2 e; Y- Y8 l- * f6 W% [* l! a. U0 T! S
- f = file('poem.txt', 'w') # open for 'w'riting8 M, }( y- f" {/ ^% g+ G8 P$ ^3 t
1 h) v1 q; E9 R- f.write(poem) # write text to file
. V- `5 N3 N- }: n! H+ _* y1 W# [
4 c: Y1 z9 h! a, L- [9 `- f.close() # close the file$ W/ m* s2 y7 `- v1 x7 p6 e; ]
2 ?8 Q: f" e0 `
) t/ g+ F8 r$ H- ' @8 e. y- u3 p+ |4 Q
- f = file('poem.txt')
% I9 u- j2 M5 }* J/ H# G4 ~ - 7 C3 `6 W( A5 M3 U I
- # if no mode is specified, 'r'ead mode is assumed by default% J# |2 a$ N# P% l1 t. Y* w9 I5 d _
# E- J' G6 A! x! C, M5 Z- while True:
8 b; V% Z1 {9 [( c9 ? - ) E N" s0 f7 [8 O& l2 I
- line = f.readline()" N+ _3 q- C6 U$ B8 M; N" T
" }! X. _3 S9 g7 n# _% a( J2 ~0 ?- t, y- if len(line) == 0: # Zero length indicates EOF: d$ M' k/ O$ K" m; O* d3 V
- ' Y" D% I7 Z3 e
- break3 ^) K1 Q6 Z) J. ^
- 4 n6 h% P" B9 f% N: P" F
- print line,% c1 ]: [& \, w
- # x1 C, }9 P3 n) A6 [5 o
- # Notice comma to avoid automatic newline added by Python
% _) ?# [5 R y; G9 d
6 o# R& G( d7 e) c- o- f.close() # close the file
% a3 q! Y' c# j
复制代码
# P2 [9 k N4 n, G9 L输出- w# M/ e5 n' y+ @3 ?, \
3 \$ e) c/ c$ h: I3 M# ^0 |
- $ python using_file.py
s8 U1 w) d% ]6 B. F - Programming is fun
% V. j3 J9 I; w# Q/ p2 _ - When the work is done) y/ |& H, n# R6 z- H$ i5 b) L) N
- if you wanna make your work also fun:/ R9 J0 j, ~& ?, C- a/ J
- use Python!
复制代码
, {, m% O# R0 \* E它如何工作9 E# x3 X/ _& J) i
) Y4 g, l5 J9 ~" R( H4 m! {: `% Y
首先,我们通过指明我们希望打开的文件和模式来创建一个 file 类的实例。模式可以为读模式('r')、写模式('w')或追加模式('a')。事实上还有多得多的模式可以使用,你可以使用 help(file)来了解它们的详情。4 s0 I, N& s/ j' O4 [0 z3 X/ M
( e2 R: Z4 l: u
我们首先用写模式打开文件,然后使用 file 类的 write 方法来写文件,最后我们用 close 关闭这个文件。
( H6 Z/ {' p0 [) a& n6 d3 z" s* {; N
1 |% `+ i2 t# y3 q接下来,我们再一次打开同一个文件来读文件。如果我们没有指定模式,读模式会作为默认的模式。在一个循环中,我们使用 readline 方法读文件的每一行。这个方法返回包括行末换行符的一个完整行。所以,当一个 空的 字符串被返回的时候,即表示文件末已经到达了,于是我们停止循环。
6 @' e) _" J. H. D
/ d4 G/ H2 O6 M( r1 ~7 b6 P注意,因为从文件读到的内容已经以换行符结尾,所以我们在 print 语句上使用逗号来消除自动换行。最后,我们用 close 关闭这个文件。
5 G+ x: C! c" ]& U E& V, W6 v1 e$ x R0 c9 H# s5 q
现在,来看一下 poem.txt 文件的内容来验证程序确实工作正常了3 s; k! ~4 m; ?
- T1 n3 Q1 l# |储存器, g; w2 ~+ M/ q) r7 Q
Python 提供一个标准的模块,称为 pickle。使用它你可以在一个文件中储存任何 Python 对象,之后你又可以把它完整无缺地取出来。这被称为 持久地 储存对象。6 f8 p9 e3 G! G2 F3 d0 Z' s
. H; v, I" V% J# z }还有另一个模块称为 cPickle,它的功能和 pickle 模块完全相同,只不过它是用 C 语言编写的,因此要快得多(比pickle 快 1000 倍)。你可以使用它们中的任一个,而我们在这里将使用 cPickle 模块。记住,我们把这两个模块都简称为 pickle 模块。: [( Q2 i7 |/ ^9 U! T2 s
) ?5 Q- A* p6 S储存与取储存0 g& Z8 Z' s9 V; O
例 12.2 储存与取储存
% c5 j0 q9 S; N) W- r& Z/ k, g3 U1 c2 t' [
- #!/usr/bin/python6 H* b6 ~6 s8 @/ t! k: Q7 e5 P# _
- # Filename: pickling.py7 N" X$ z+ n5 ~) d- U: o
- / [3 T2 {2 @0 E# Z4 ?
- import cPickle as p1 H% }3 @1 Z2 N
- #import pickle as p, c, C. ^. K& {: |: ^2 l. `7 w
- $ q. D# J2 y' y+ V0 G
- shoplistfile = 'shoplist.data'1 z& y4 m* T* _; i
- # the name of the file where we will store the object
- z& g4 g+ R" z
# }! y( h4 ~9 b! E* v& J; ?/ U2 p- shoplist = ['apple', 'mango', 'carrot']7 F' _# G% ~- ^3 q6 G4 L
- - \2 H$ M* C, O% [, [4 N, W" _% N
- # Write to the file3 ]% n1 C* D$ S% r8 J' k
- f = file(shoplistfile, 'w')3 x+ _6 W H8 t' b" O! a
- p.dump(shoplist, f) # dump the object to a file
# c/ o1 J5 e3 t - f.close()2 H& ~( S& v" ^+ Q
6 N) f# l# ?0 j- del shoplist # remove the shoplist
+ T9 }" }5 h2 I) h) c - 8 N# Z6 ?, Y3 s& o9 w
- # Read back from the storage( b( Z( n8 I7 O( o2 Q; ~; C
- f = file(shoplistfile)
5 \6 i# K4 ~% N' w5 k( n1 Q - storedlist = p.load(f)
D4 [ h, W1 q5 R - print storedlist #!/usr/bin/python
6 O" |8 |, r* |0 y$ [* L - # Filename: pickling.py
, L( c4 Z! R5 ?$ n3 y. |; o - + A9 s/ n: c8 L
- import cPickle as p
8 @1 O8 @) L+ g' g - #import pickle as p
. V; T' J9 H4 c$ B6 E8 _ - ( F) w% c' D: {1 Z2 {
- shoplistfile = 'shoplist.data'/ m( l, z n, \
- # the name of the file where we will store the object
9 J4 I3 J( G& Z1 `
$ r% ]" j1 `0 Z2 I* E4 E% d" P8 \- shoplist = ['apple', 'mango', 'carrot']
$ P3 I2 a1 x& C: w( J - - ], c7 |4 F" ^" v1 k4 l Q) `
- # Write to the file
" R% [2 _1 c7 p& k2 M0 j1 E+ m1 D - f = file(shoplistfile, 'w')
: l. p; i/ Z4 N - p.dump(shoplist, f) # dump the object to a file) k& w# ^6 b7 `& G! H) j
- f.close()2 i l; F; b5 s7 t) O3 `4 q6 F( f
1 _5 e5 g( b6 {: q; I2 H! R- del shoplist # remove the shoplist
: r/ R0 e* }6 n+ |; Y
* L( [* b5 x, Q5 f0 Y- o- # Read back from the storage
- d O9 d2 g# {! q+ j - f = file(shoplistfile)$ Y( n: G# b2 H |: \5 X
- storedlist = p.load(f) f% j- [. P+ Q0 F4 [( t
- print storedlist
复制代码
0 s' ?1 g w* L* }# }2 Y3 p输出$ X% y* X1 u# S: ?
- $ python pickling.py
D h9 w9 z5 K7 } - ['apple', 'mango', 'carrot']
复制代码
2 R) ]8 w% b3 c, J' A% [, ?% q它如何工作
7 C9 n) u% x) c8 i, c) j
2 V2 L. r5 @0 I) p) k: {首先,请注意我们使用了 import..as 语法。这是一种便利方法,以便于我们可以使用更短的模块名称。在这个例子中,它还让我们能够通过简单地改变一行就切换到另一个模块(cPickle 或者 pickle)!在程序的其余部分的时候,我们简单地把这个模块称为 p。( [" D# W) y' g! i# L
8 T5 Q5 F3 q7 ?& L' q为了在文件里储存一个对象,首先以写模式打开一个 file 对象,然后调用储存器模块的 dump 函数,把对象储存到打开的文件中。这个过程称为 储存 。; m0 T' S) C- B
! E' ?5 g3 }$ Z, Y
接下来,我们使用 pickle 模块的 load 函数的返回来取回对象。这个过程称为 取储存 。* c7 _) ^# Q& d' Z' \4 H3 b7 O
3 m% m" S8 I. M- n* W概括
8 j, E* P8 c2 h' t4 ^& |$ c我们已经讨论了多种类型的输入/输出,及文件处理和使用储存器模块。; N, h* F& S- I, T2 _
" \ o! I3 ~7 d Y* a接下来,我们将探索异常的概念。
/ |9 G' |) \) z- {4 m6 ?" `# X3 p. @
|