这一章主要是讲述程序展示其数据的一些方法,一般都是直接按照一定的格式输出在屏幕,或者写入到文件以便以后使用。按照一定格式的输出,在python中实际就是对str的操作,主要就是介绍了formart()的灵活使用。然后就是基本的打开文件,内置的函数open()后,可以对文件进行简单的读取,按需读取等,最后大致介绍了下JSON数据结构。
5.1 旧的字符串格式输出方式
使用%输出字符串,这是我未看文档前知道的,也以为是唯一的print输出字符串方式,看完之后才知道这种方式已经在2.7.11中被称为old的了。
>>> import math >>> print 'The value of PI is approximately %5.3f.' % math.pi The value of PI is approximately 3.142.
5.2 友好的格式化输出
如果你想更好的控制你的输出而不是简单的打印一些空格,通常有2种方式,一种是自己处理所有的字符串,使用string的切片和连接操作,字符串类型有一些方法,用于执行将字符串填充到指定列宽度的有用操作,第二种方法是使用str的format()方法。
要使用str的format()方法,当然首先要保证当前对象的类型就是string类型,string模块提供了2个方法,可以讲任何对象都转换成string对象。str()和repr()。他们之间区别如下:str()返回一个人类可读性强的字符串,而repr()返回式解释器可读的字符串;对于数字,列表,字段这些数据结构,使用这2个方法得到的是同样的结果,但是对字符串和浮点数的使用是不相同的:
s = 'hello ' print s print str(s) print repr(s) print str(math.pi) print repr(math.pi)
结果如下:
可以看到:repr()在操作string字符串的时候增加了引号和反斜杠,而str是没有的。
现需要打印出1-10的1次方,2次方,3次方的值,如下所示:
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
按照以前的思维会怎么做呢?以我c++刚入门的功力写,貌似更搓,需要打印数值,再打印空格。。。。
python单纯的使用string类型的方法,可以这样实现:
for x in range(1,11): print str(x).ljust(2),str(x*x).ljust(3),str(x*x*x).ljust(4)
ljust()是str模块内的一个方法,函数原型是: S.ljust(width[, fillchar]) -> string,在字符串的左边插入width个fillchar,默认fillchar是space。巧妙的实现了字符串后面空N格的需求,当然有左边,肯定有右边,也有中间,对应的方法是 str.ljust()
and str.center(),具体使用就不举例了。
如果使用str的format方法,貌似更简洁了:
for x in range(1,11): print '{0:10d} {1:10d} {2:10d}'.format(x,x*x,x*x*x)
format的基本使用如下:花括号及其中的字符(称为格式字段)将被替换为传递给str.format()方法的对象。括号中的数字指传递给str.format()方法的对象的位置。
>>> print 'We are the {} who say "{}!"'.format('knights', 'Ni') We are the knights who say "Ni!
>>> print 'The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',other='Georg')
The story of Bill, Manfred, and Georg.
>>>table = {'name':'loleina','age':25}
>>>print 'name :{name}, age:{age:d}'.format(**table)
数字后后允许可选的':'和格式指令。这样可以更好地控制如何设置值的格式。下面的例子将 Pi 转为三位精度。
>>> import math >>> print 'The value of PI is approximately {0:.3f}.'.format(math.pi) The value of PI is approximately 3.142.
':'后面紧跟一个整数可以限定该字段的最小宽度。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print '{0:10} ==> {1:10d}'.format(name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd ==> 4127
5.3 读写文件
调用内置函数open()可以返回一个文件对象,一般都是带2个参数:open(filename, mode)。
>>> f = open('workfile', 'w') >>> print f <open file 'workfile', mode 'w' at 80a0960>
第一个参数是一个含有文件名的字符串。第二个参数也是一个字符串,含有描述如何使用该文件的几个字符。mode为'r'时表示只是读取文件;w 表示只是写入文件(已经存在的同名文件将被删掉);'a'表示打开文件进行追加,写入到文件中的任何数据将自动添加到末尾。 'r+'表示打开文件进行读取和写入。mode 参数是可选的,默认为'r'。
这个例子是官网的例子,运行后,在当前项目的目录下生成了一个workfile的文件,类型为文件类型(不是文本类型),如果在文件名后加上txt,就生成了一个文本文档类型。
在 Windows 平台上,模式后面追加 'b'表示以二进制方式打开文件,所以也有像'rb'、 'wb'和'r+b'这样的模式。Python 在 Windows 平台上区分文本文件和二进制文件;读取或写入文本文件中时,行尾字符会被自动地稍加改变。这种修改对 ASCII 文本文件没有问题,但会损坏JPEG或EXE这样的二进制文件中的数据。在读写这些文件时一定要记得以二进制模式打开。在 Unix 平台上,在模式后面附加一个'b'也不会有坏处,这样可以用写好的文件访问代码来读写任何平台上的所有二进制文件。
得到文件句柄后,可以对文件进行读写操作,一次性读取read();一行一行读取readline(),不去掉换行符;写操作write();查询当前文件游标(偏移量)tell(),移动游标seek();read()函数内如果加整型参数,表示读取整数个byte。举例如下:
f = open('test.txt','r+') print f print f.read()
f.close()
运行结果:
<open file 'test.txt', mode 'r+' at 0x0341D1D8>
first line
second line
third line
r = open('workfile','r+') r.write('0123456789abcdefg') print r.tell() print r.seek(5) print r.read(1) print r.tell()
r.close()
运行结果:
17
None
5
6
在python中处理文件对象时使用with关键字是很好的做法。这样做的好处在于文件用完后会自动关闭,即使过程中发生异常也没关系。它还比编写一个等同的try-finally语句要短很多,如果需要读取文件内每一行,可以循环遍历文件对象来读取文件中的每一行。这是既省内存又非常快的简单代码。
with open('workfile','r') as f: for line in f: print line print f.closed
运行结果:
0123456789abcdefg
True
5.4 使用json存储结构化数据
从文件中读写字符串并不是很难。数值就要多费点儿周折,因为read ()方法只会返回字符串,应将其传入int()这样的函数,就可以将'123'这样的字符串转换为对应的数值 123。当你想要保存更为复杂的数据类型,例如嵌套的列表和字典,手工解析和序列化它们将变得更复杂。Python 允许使用常用的数据交换格式JSON(JavaScript Object Notation)。标准模块json可以接受 Python 数据结构,并将它们转换为字符串表示形式;此过程称为序列化。从字符串表示形式重新构建数据结构称为反序列化。序列化和反序列化的过程中,表示该对象的字符串可以存储在文件或数据中,也可以通过网络连接传送给远程的机器。
这一章节,之前有专门总结过,再次就不墨迹了。可以点此链接进行查看: python对json的操作总结