第七章 输入输出
有几种办法可以从程序输出;数据可以用可读的形式显示,或保存到文件中以备日后使用。本章讨论一些输入输出的办法。
7.1 输出格式控制
到现在为止我们已经看到了两种输出值的方法:表达式语句和print语句。(第三种方法是使用文件对象的write()方法,标准输出文件可以用sys.stdout引用。参见库参考手册)。
我们常常需要控制输出格式,而不仅仅是显示空格分开的值。有两种办法控制输出格式:一种办法是自己进行字符串处理,用字符串的片断和合并操作可以产生任何可以想象的格式。标准模块string包含了诸如把字符串填充到指定的列宽这样的有用操作,后面会有提及。
另一种办法是使用%运算符,此运算符以一个字符串为左运算元,它按C的sprintf()函数格式把右运算元转换为字符串,返回转换结果。
问题是:如何把值转换为字符串?
幸运的是,Python有一种办法可以把任何值转换为字符串:使用repr()函数,或把值写在两个反向引号(``)之间。例如:
>>> x = 10 * 3.14
>>> y = 200*200
>>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...'
>>> print s
The value of x is 31.4, and y is 40000...
>>> # 反向引号也适用于非数值型
... p = [x, y]
>>> ps = repr(p)
>>> ps
'[31.4, 40000]'
>>> # 转换字符串对字符串加字符串引号和反斜杠
... hello = 'hello, world '
>>> hellos = `hello`
>>> print hellos
'hello, world12'
>>> # 反向引号内可以是一个序表
... `x, y, ('spam', 'eggs')`
"(31.4, 40000, ('spam', 'eggs'))"
|
下面是两种写出平方、立方表的方法:
>>> import string
>>> for x in range(1, 11):
... print string.rjust(`x`, 2), string.rjust(`x*x`, 3),
... # 前一行的结尾逗号表示不换行
... print string.rjust(`x*x*x`, 4)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1,11):
... print'%2d %3d %4d' % (x, x*x, x*x*x)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
|
注意print输出的各项之间额外加了一个空格,这是print的规定。
此例显示了函数string.rjust()的用法,此函数可以把一个字符串放进指定宽度右对齐,左边用空格填充。类似函数还有string.ljust()和string.center()。这些函数不向外输出,只是返回转换后的字符串。如果输入字符串太长也不会被截断而是被原样返回。这样的处理可能会使你的列对齐失效,但这可能比截断要好一些,截断的结果是我们看到一个错误的值。(如果你确实需要截断的话总可以再加一层片断,如string.ljust(x,n)[0:n])。
还有一个函数string.zfill(),可以在数值左边填零。此函数可以处理带有加减号的情况:
>>> string.zfill('12', 5)
'00012'
>>> string.zfill('-3.14', 7)
'-003.14'
>>> string.zfill('3.14159265359', 5)
'3.14159265359'
|
操作符的用法如下例:
>>> import math
>>> print 'The value of PI is approximately %5.3f.' % math.pi
The value of PI is approximately 3.142.
|
如果有多个值可以用一个序表给出,这时格式字符串中要有多个格式,如:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> for name, phone in table.items():
... print'%-10s ==> %10d' % (name, phone)
...
Jack ==> 4098
Dcab ==> 8637678
Sjoerd ==> 4127
|
大多数格式与C用法相同,要求要输出的值的类型符合格式的需要。但是,如果你没有引发例外错误的话也不会产生内核堆列。Python的%s格式要宽得多:如果相应的输出项不是字符串对象,就先用str()内置函数把它变成字符串。在格式指定中宽度指定为*号表示后面的输出项中多出一个指定宽度的整数。C格式%n和%p未被支持。
如果你有一个长格式串不想把它分开,可以在指定格式的地方指定名字,这样就不需要按次序去把格式和名字对应起来,这种格式为“%(变量名)格式”,例如:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d;
Dcab: %(Dcab)d' % table
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
|
这里输出项总是一个字典,字典的各项值是要输出的值,字典的键值是各值的名字。这种输出格式经常与内置函数var()配合使用,var()返回包含所有局部变量的字典。
7.2 读写文件
open()打开一个文件对象,经常使用两个参数:“open(文件名,模式)”。例如: