输入输出

Learn from python2.7 official documentation

参考:菜鸟教程Python File方法

数据可以以人类可读的形式打印出来,或者写入文件以供将来使用。

7.1 更漂亮的输出格式Output Formatting

7.1.1 字符串转化

Python提供了两种内置函数,可以将任意值转化为字符串:repr()str()

repr()函数将对象转化为供解释器读取的字符串形式:

1
2
3
s = 'This is a string'
print repr(s)
>>> 'This is a string'

str()函数将对象转化为适于人阅读的字符串形式:

1
2
3
s = 'This is a string'
print str(s)
>>> This is a string

对于没有特定供人阅读表述的对象,repr()str()将返回相同的值:

1
2
3
4
5
n = 3.1415
print repr(n)
>>> 3.1415
print str(n)
>>> 3.1415

7.1.2 字符串对齐

str.rjust()方法可以在字符串左侧填充空格来在给定宽度的字段中右对齐字符串:

1
2
3
4
5
6
7
8
9
10
>>> for x in range(1, 6):
... print repr(x).rjust(2), repr(x*x).rjust(3),
... # Note trailing comma on previous line
... print repr(x*x*x).rjust(4)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125

注意:如果输入字符串太长,str.rjust()方法不会截断它,而会返回原字符串。如果想阶段超过长度的字符串,可以添加slice操作:

1
x.rjust(n)[:n]

类似的方法还有:左对齐str.ljust()和中对齐str.center()

str.zfill(n)方法将字符串最左侧的数字字符串用零填充至整个字符串长度为n,而不改变数字大小,且可识别正负号:

1
2
print '-3.14 this is pi'.zfill(20)
>>> -00003.14 this is pi

7.1.3 字符串格式化

通常,程序员需要自定义输出格式来取代以空格分隔的值,有两种格式化输出格式的方法:

  • 使用字符串分割(slicing)和连接(concatenation)操作手动处理所有字符串;
  • 使用str.format()方法。

str.format()格式化字符串用法如下:

1
2
3
x = 2
print '{0:2d} {1:3d} {2:4d}'.format(x, x * x, x * x * x)
>>> 2 4 8

花括号及其中的参数称为格式字段(format fields),其将被替换为传递给str.format()方法的对象,方括号中':'前的数字表示传递给str.format()方法对象的位置,方括号中':'后的字段是一个可选的格式说明符,用来更好地控制值的格式。

如果在str.format()方法中使用了关键字参数,则可以使用参数名称来引用其值:

1
2
print 'This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible')
>>> This spam is absolutely horrible.

'!s''!r可在花括号中,用来在格式化之前将str.format()方法对象的值转化为指定类型的(str()repr())字符串:

1
2
3
4
5
print 'The value of PI is approximately {!r}.'.format(math.pi)
>>> The value of PI is approximately 3.141592653589793.

print 'The value of PI is approximately {!s}.'.format(math.pi)
>>> The value of PI is approximately 3.14159265359.

可以使用"**"符号传递参数来解析字典:

1
2
3
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
print 'Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)
>>> Jack: 4098; Sjoerd: 4127; Dcab: 8637678

7.1.4 旧的格式化字符串的方法

% 操作符也可以用作字符串格式化,它将右边的参数格式化并替换入原字符串含有%格式的位置:

1
2
print 'The value of PI is approximately %5.3f.' % math.pi
>>> The value of PI is approximately 3.142.

7.2 读写文件

7.2.1 open(filename, mode)函数

open(filename, mode)返回一个文件File对象,第一个参数是包含文件名的文件路径字符串,第二个参数是文件打开模式,包括:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

7.2.1 File对象的方法

下表列出了File对象常用的函数:

序号 方法及描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回True,否则返回False
file.next() 返回文件下一行。
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) 读取整行,包括 "\n" 字符。
file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
file.seek(offset[, whence]) 设置文件当前位置
file.tell() 返回文件当前位置。
file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。