11.1 打开文件
open函数用来打开文件,语法如下:
open(name[.mode[.buffering]])
open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式(mode)和缓冲(buffering)参数都是可选的。
假设有一个名为whisper.txt的文件,存储路径为C:\text(或者在UNIX下的~/text),那么可以像下面这样打开文件:
f=open(r'C:\text\whisper.txt')
如果文件不存在,则会报异常。
如果open函数只带一个文件名参数,那么我们可以获得能读取文件内容的文件对象。如果要向文件内写入内容,则必须提供一个模式参数(如下表所示)来显式声明。
明确指定读模式和什么模式参数都不用的效果是一样的。使用写模式可以向文件写入内容。
'+'参数可以用到任何模式中,指明读和写都是允许的。比如'r+'能在打开一个文本文件用来读写时使用。
'b'模式改变处理文件的方法。一般来说,Python假定处理的是文本文件(包含字符).通常这样做不会有任何问题,但如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或者图像,那么应该在模式参数中增加'b',例如参数'rb'可以用来读取一个二进制文件。
open函数的第3个参数(可选)控制着文件的缓冲。如果参数是0(或者是False),I/O就是无缓冲的(所有的读写都直接针对硬盘);如果是1(或者是True),I/O就是有缓冲的(意味着Python使用内存来代替硬盘,让程序更快,只有使用flush或者clsoe时才会更新硬盘上的数据);大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认的缓存区大小。
11.2 基本文件方法
文件(或流)最重要的能力是提供或者接受数据。如果有一个名为f的类文件对象,那么久可以用f.write方法和f.read方法(以字符串形式)写入和读取数据。
每次调用f.write(string)时,所提供的参数string会被追加到文件中已存在部分的后面。
f=open(r'C:\text\whisper.txt','w')
f.write('Hello,')
f.write('World!')
f.close()
在完成了对一个文件的操作时,调用close关闭文件对象。
读取更简单,只要记得告诉流要读多少字符(字节)即可。如下所示:
f=open(r'C:\text\whisper.txt','r') //或者f=open(r'C:\text\whisper.txt')
f.read(4)
'Hell'
f.read()
'o,World!'
首先指定了要读取的字符数"4",然后读取了剩下的文件。注意,在调用open读文件时可以省略模式说明,因为'r'是默认的。
除了读取单个字符外,还可以使用file.readline读取单独的一行(从当前位置开始直到一个换行符出现,也读取这个换行符)。不使用任何参数时读取一行并返回,或者使用一个非负的整数作为readline参数可以读取该行的最大值。readlines方法可以读取一个文件中的所有行并将其作为列表返回。假如有如下文件:
##demo.txt
Hello,World!
It is a demo!
f=open(r'C:\text\demo.txt')
f.readline() //返回'Hello,World!\n'
f=open(r'C:\text\demo.txt')
f.readline(100) //返回'Hello,World!'(第一行100个字符,不足则返回第一行)
f=open(r'C:\text\demo.txt')
f.readlines() //返回['Hello,World!\n', 'It is a demo!']
writelines方法和readlines方法相反:传给它一个字符串的列表(实际上是任何序列或者可迭代的对象都行),它会把所有的字符串写入文件(或流)。注意,程序不能增加新行,需要自己添加。没有writeline方法,因为能使用write。
应该牢记使用close方法关闭文件。通常来说,一个文件对象在退出程序后(也可能在退出前)自动关闭,尽管是否关闭文件不是很重要,但关闭文件是没有什么害处的,可以避免在某些操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。
写入过的文件总是应该关闭,是因为Python可能会缓存写入的文件,入过程序崩溃了,那么数据根本不会被写入文件。为了安全起见,要在使用完文件后关闭。
如果想确保文件被关闭了,那么应该使用try/finally语句,并且在finally子句中调用close方法。
#Open your file here
try:
# Write data to your file
finally:
file.close()
11.3 对文件内容进行迭代
对文件内容进行迭代以及重复执行一些操作,是最常见的文件操作之一。定义如下函数:
def process(string):
print 'Processing:',string
最常见的对文件内容进行迭代的方法是在while循环中使用read方法。例如,对每个字符(字节)进行循环,可以用如下方法实现:
f=open(r'D:\workplace\python\demo.txgt')
char=f.read(1)
while char:
process(char)
char=f.read(1)
f.close()
或者如下所示:
f=open(r'D:\workplace\python\demo.txt')
while True:
char=f.read(1)
if not char:
break
f.close()
当处理文件时,经常会对文件的行进行迭代而不是单个字符。处理行使用的方法和处理字符一样,即使用readline方法:
f=open(r'D:\workplace\python\demo.txt')
while True:
line=f.readline()
if not line:
break
f.close()
如果文件不是很大,可以说使用read方法一次读取整个文件(把整个文件当做一个字符串来读取),或者使用readlines方法(把文件读入一个字符串列表,在列表中每个字符串就是一行)。可以像下面这样做:
f=open(r'D:\workplace\python\demo.txt')
for char in f.read():
process(char)
f.close()
或者:
f=open(r'D:\workplace\python\demo.txt')
for line in f.readlines():
process(line)
f.close()
在需要对一个非常大的文件进行迭代行的操作时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法来替代。当然,在Python中如果能使用for循环,那么它就是首选。下面使用fileiinput来对文件进行迭代:
import fileinput
for line in fileinput.input(r'D:\workplace\python\demo.txt')
f.close()
在Python的近几个版本中(从2.2开始),文件对象是可迭代的,这就意味着可以直接在for循环中使用它们,从而对它们进行迭代:
f=open(r'D:\workplace\python\demo.txt')
for line in f:
process(line)
f.close()
注意sys.stdin是可迭代的,就像其他文件对象。因此如果想要迭代标准输入中的所有行,可以按如下形式使用sys.stdin:
import sys
for line in sys.stdin:
process(line)
可以对文件迭代器执行和普通迭代器相同的操作。比如将它们转换为字符串列表(使用list(open(filename))),这样所达到的效果和使用readlines一样。