打开文件
open(name[, mode[, buffering]])
打开模式
open函数默认的打开方式为读模式。
open中模式参数的常用值
值 | 描述 |
---|---|
'r' | 读模式 |
'w' | 写模式 |
'a' | 追加模式 |
'b' | 二进制模式(可以添加到其他模式中使用) |
'+' | 读/写模式(可以添加到其他模式中使用) |
将文件以二进制形式打开,这个只有在Python进行换行符转换的平台上才需要,如windows、mac
通过在模式参数中使用U参数能够在打开文件时使用通用的换行符支持模式,在这种模式下,所有的换行符/字符串(\r\n、\r或者是\n)都被换成\n,而不用考虑运行的平台。
缓冲
open函数的第3个参数控制着文件的缓冲具体如下:
0(False):无缓冲
1(True):有缓冲
>1:代表缓冲区的大小
-1:代表使用默认缓冲区的大小
基本的文件方法
类文件对象是支持一些file类方法的对象,最重要的是支持read方法或者write方法,或两者都支持。
三种标准的流
sys.stdin、sys.stdout、sys.stderr
读和写
f.write()、f.read()
每次调用f.write方法时,所提供的参数string会被追加到文件中已存在的部分后面。
管式输出
UNIX的shell(就像GNU bash)中,使用管道可以在一个命令后面续写其他多个命令,就像下面这个例子(假设是GNU bash)
cat somefile.txt | python somescript.py | sort
GNU bash 在windows中也是存在的。http://www.cygwin.com上面有更多信息。在Mac os X中,是通过Terminal程序,可以使用shell文件。
随机访问
前文介绍的读写都是按照从头到尾的顺序读写数据,事实上可以通过seek和tell来直接访问感兴趣的部分(随机访问)
seek(offset[, whence]):把当前位置移动到offset和whence定义的位置,其中offset表示偏移量。whence默认是0:表示偏移量从头计算,为1:表示从当前位置计算,为2:表示从文件末尾移动。
tell方法返回当前文件的位置。
读写行
readline([num]):num非负,表示readline最多读写的字符数。
readlines():读出文件中的所有行,并以行列表的形式返回。
writelines():和readlines正好相反。
没有writeLine方法,只能使用write
关闭文件
打开文件后,在没有往文件中写入内容或者不着急从内存中把内容写入硬盘的情况下,理论上可以不显式关闭文件(通常,一个文件在退出程序后(前)自动关闭),但关闭文件可以避免操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。
with语句可以打开文件并将其赋值到变量上。之后可以将数据写入语句体中的文件。文件语句结束后会被自动关闭,即使是由于异常引起的结束也是如此。
在Python2.5中with语句只有在导入如下模块才能使用:
from __future__ import with_statement
而2.5以后的版本中,with语句可以直接使用。
如果需要继续使用文件,但又想及时将内容写入硬盘,就需要调用文件对象的flush方法。
上下文管理器
with语句可用作上下文管理器,进入with语句块时__enter __方法(无参数)被调用,返回值绑定到as之后的变量,离开with语句块时__exit __ 方法被调用(异常类型、异常对象和异常回溯三个参数),如果__exit __方法返回false,那么所有异常都不会被处理。
文件也可以作为上下文管理器。它们的__enter __方法返回文件对象,__exit __方法关闭文件。
对文件内容进行迭代
按字节处理
f = open(filename)
char = f.read(1)
while char:
process(char)
char = f.read(1)
f.close()
按行操作
f = open(filename)
while True:
line = f.readline()
if not line: break
process(line)
f.close()
读取所有内容
如果文件不大可以通过read()和readlines()读取所有内容。
使用fileinput实现懒惰迭代
当文件比较大可以通过fileinput实现懒惰迭代(读取实际需要的文件部分)
import fileinput
for line in fileinput.input(filename):
process(line)
旧式代码中使用xreadlines实现懒惰迭代。
文件迭代器
从Python2.2开始,文件对象是可迭代的。
for line in open(filename):
process(line)
注意sys.stdin是可迭代的,就像其他文件一样。
可以对文件迭代器执行和普通迭代器一样的操作。比如:将他们转换为字符串列表(list(open(filename)))
使用print来向文件内写入内容会在提供的字符串后面增加新的行
总结:
- 本章学习的内容围绕open函数展开,open返回的对象叫文件对象,接着介绍了类文件对象
- 介绍了类文件对象的方法read、write、readline、readlines、writelines等方法。
- 介绍了open函数的三个参数:文件名、打开模式、缓存
- 介绍了随机访问:seek方法和tell方法
- open打开的文件最好关闭,并介绍了with语句实现文件打开后的即时关闭,介绍了上下文管理器
- open打开的类文件对象是可迭代的,也可以通过方法read、readline方法按字节按行进行迭代
- 使用fileinput实现懒惰迭代
- 介绍了标准流、管式连接