学习Python Doc第六天: 输入和输出
一个程序的输出可以有多种呈现方式:1)通过屏幕打印;2)通过写入文件。今天我们来探讨这两种方法。
1 多种多样的输出格式
像在 C
语言中一样, Python
也提供了样式繁多的输出格式。在 Python
中你可以自己控制输出格式,可以通过 str.format()
这个方法实现。
在 Python
中有两种方式实现值到字符串的转换: repr()
和 str()
。 repr()
函数生成解释器可读的格式; str()
生成人类可读的格式。(看Python Tutorial的这段文字的时候,有想打人的冲动,写的非常零散。本以为英文文档应该会好一些,现在对Python的官方手册质量不敢恭维,) 直接看代码:
In [25]: s = 'hello, world.' In [26]: str(s) Out[26]: 'hello, world.' In [27]: s Out[27]: 'hello, world.' In [28]: str(1/7) Out[34]: '0.14285714285714285' In [35]: x = 10 * 3.25 In [50]: y= 200*200 In [66]: s = 'the value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' In [123]: print(s) the value of x is 32.5, and y is 40000... In [128]: #the repr() of a string adds string quotes and backslashes: In [160]: hello = 'hello world\n' In [168]: hellos = repr(hello) In [172]: print(hellos) 'hello world\n' In [173]: # the argument to repr() may be any python objects: In [189]: repr((x,y,('spam','eggs'))) Out[215]: "(32.5, 40000, ('spam', 'eggs'))"
接下来给出两种输出平方表和立方表的方法:
for x in range(1,11): print(repr(x).rjust(2), repr(x*x).rjust(3),end = ' ') print(repr(x*x*x).rjust(4))
输出为:
In [218]: 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('{0:2d} {1:3d} {2:4d}'.format(x,x*x,x*x*x))
输出同上一种方法。
注意:在第一种方法中,每一列后都有一个空格,这个空格是 print()
自动加上去的, print()
总是在它的参数中加空格。第一种方法演示了字符对象的 str.rjust()
方法。 str.rjust()
实现了右对齐。举一反三,存在 str.ljust
和 str.center()
. 还有另外一个方法 str.zfill()
这个方法在一串数值前面填零。看代码:
In [220]: '12'.zfill(6) Out[233]: '000012' In [234]: 'abc'.zfill(6) Out[241]: '000abc' In [242]: '-abc'.zfill(6) Out[262]: '-00abc' In [263]: '-45'.zfill(6) Out[283]: '-00045'
可以看出 str.zfill
把 .
之前的字符当做有符号数值字符。
基本的 str.format()
使用方法是:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) We are the knights who say "Ni!"
使用大括号代表待输入的参数,输入参数通过 .format
提供。可以通过在大括号中填入数字指定 .format
后的字符串填入的位置。
In [284]: print('{0} and {1}'.format('spam','egg')) spam and egg In [302]: print('{1} and {0}'.format('spam','egg')) egg and spam In [303]: print('{2} and {0}'.format('spam','egg')) --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-303-f5413a9d7179> in <module>() ----> 1 print('{2} and {0}'.format('spam','egg')) IndexError: tuple index out of range
可以看到也有数组越界问题存在。
可以在 print()
中使用关键字。比如:
In [304]: print('This {food} is {adjestive}.'.format(food='spam',adjective='absolutely horrible')) --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-389-9f9f624a721c> in <module>() ----> 1 print('This {food} is {adjestive}.'.format(food='spam',adjective='absolutely horrible')) KeyError: 'adjestive' In [390]: print('This {food} is {adjective}.'.format(food='spam',adjective='absolutely horrible')) This spam is absolutely horrible.
注意关键词的对应。也可以组合以上两种方法:
In [396]: print('The story of {0},{1},and {other}'.format('Bill','Manfred',other='Georg')) The story of Bill,Manfred,and Georg
通过 :
来指定显示格式。
In [472]: print('pi is {0:.3f}'.format(math.pi)) pi is 3.142
在 :
之后跟上一个整数可以指定最小的显示宽度,这在美化表格显示方面非常有用。
table = {'Sjoerd': 4127,'Jack':4098,'Dcab':7678} for name,phone in table.items(): print('{0:10} ==> {1:10d}'.format(name,phone) )
输出为:
In [560]: Sjoerd ==> 4127 Jack ==> 4098 Dcab ==> 7678
1.1 之前的字符格式化方式
%
字符在较老的Python版本中用来做字符串格式化,其格式化过程与 sprintf()
函数差不多。
In [565]: print('pi is %5.3f' % math.pi) pi is 3.142
2 文件的读写
open()
返回一个文件对象,最经常的实用方式是 open(filename,mode)
第一个参数是文件名字,第二个是文件的读写模式可选的选项有:
r
只读w
只写,同名文件会被覆盖。a
打开文件,写在文件最后边。r+
读写。
默认情况下 mode
参数的值是 r
。
通常,文件是作为文本进行编辑的,也就是说有指定的文本编码格式。 b
是二进制编码。如果没有指定编码格式则文本的编码格式依操作系统平台而定。
文件的常用方法有:
f.read()
读出文件内容。f.readline()
读出文件的一行。f.write(string)
向文件中写入。f.seek(5)
找到文件的第6行。f.close()
关闭文件。
2.1 使用 json
字符串可以很容易的读写,数值就麻烦了点儿。因为 read()
函数只返回字符串。如果读出 '123'
还需要使用 int()
来返回真实的数值。碰上复杂的数据类型,操作就更麻烦了。
万幸, Python
使用 JSON
(JavaScript Object Notation)来作为数据保存格式, JSON
是一种广为使用的数据交换格式。。 Python有处理 JSON
的标准库 json
。这个库可以方便的层次化保存数据,把这些数据保存成字符串(这个过程叫做 serializing
);也可以方便的把这些字符创变回数值( 这个过程叫做 deserializing
).
关于 JSON
的介绍就到这里,以后用到了再来补充。