11.1 打开文件 open( name[ ,mode[ , buffering]])
11.1.1 文件模式
access_mode:文件使用模式,在open函数中默认为只读。其他模式还有:
w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a(append):以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
r+:以读写模式打开,该文件必须存在。
w+:以读写模式打卡,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+:以读/追加写方式打开一个文本文件。若文件不存在,则新建一个文本文件
rb(binary):以二进制读模式打开
wb:以二进制写模式打开
ab:以二进制追加模式打开
rb+:以二进制读写模式打开
wb+:以二进制读写模式打开
ab+:以二进制追加模式打开
关于二进制模式:
python用文本模式打开文件时,会转化换行符,以保证程序的跨平台使用。这就导致了问题,当使用二进制文件时,再使用文本模式打开可能会破坏二进制数据。此时应该使用二进制模式打开。
(或者可以在模式参数中使用 U 参数,能在打开文件时使用通用的换行符支持模式,此模式下,所有的换行符都将被转换成\n,不必考虑运行的平台)
11.1.2 缓冲(buffer)
0 (或者False) I/O(输入输出)就是无缓冲的(所有读写操作直接针对硬盘)
1(True):I/O 有缓冲,python使用内存代替硬盘,使程序更快 。当 使用 flush 或者 close 时才会更新硬盘的数据
大于1:表示缓冲区的大小(字节)
-1(或者任何负数):表示使用默认的缓冲区大小
11.2 基本文件方法
f=open() file() (open是file的别名)对象常用的方法
read():读取字符串,告诉流要读多少字节 read(4) ,不填就是全读
write():将字符串写入文件(追加到文件中以有字符的后面),写入对象为字符串
close():关闭文件,这样缓存才会写入磁盘(flush)
readline():读取文件单独的一行,从当前位置直到换行符的出现,包括行结束符。可加入一个非负参数,限定readline可读取的字符的最大值
readlines():读取一个文件的所有行,并作为列表返回
writelines():与readlines 相反,将列表写入文件,对象是列表。注意:程序不会自己添加换行符,要自己加(window系统下,\r\n和\n都可以)
随机访问:
seek(offset[,whence]): 把当前读写位置,移动到由offset和whence定义的位置 ,offset类是一个 字节数 ,表示偏移量。whence(默认为0)表示偏移量是从文件头开始计算的(offset必须非负) whence为1 ,表示相对于当前位置移动,此时offset 可负 。 2表示相对文件结尾移动
tell():返回当前文件指针的位置
***11.2.2管式输出 (UNIX 的 shell中)
使用管道可以在一个命令后面续写其他的多个命令
$ cat somefile.txt | python somescript.py | sort
在window dos中
type somefile.txt | python somescript.py | sort
(type 对应cat)
管道符号(|)将一个命令的标准输出和下一个命令的标准输入连在一起了
比如这里,somefile.txt 就作为somescript的 sys.stdin
11.2.3 读写行
11.2.4 关闭文件
还可以使用专门为此设立的 with 语句
with open('somefile.txt') as somefile:
do_something(somefile)
with语句打开文件,并且将其赋值到变量 somefile上 。之后就可以对文件进行操作
11.3 对文件内容进行迭代
f=open(filename) #一个字符一个字符的读取
while True:
char=f.read(1)
if not char:break
process(char)
f.close()
11.3.2 按行操作
f=open(filename)
while True:
line=f.readline()
if not line:break
process(line)
f.close()
11.3.3 读取所有内容
11.3.5 文件迭代器
f=open(filename)
for line in f:
process(line)
f.close()
同样,sys.stdin也是可迭代的