python基础教程总结10——文件
1.打开文件
open(name[mode[,buffing]) 参数: 文件,模式,缓冲
1)name: 是强制选项,模式和缓冲是可选的
#如果文件不在,会报下面错误
1 >>> f = open(r'D:\text.txt','r') 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 IOError: [Errno 2] No such file or directory: 'D:\\text.txt'
2)文件模式
'r' 读模式 'w' 写模式 ’a' 追加模式 'b' 二进制模式(可添加到其他模式中使用) ’+' 读/写模式(可添加到其他模块中使用)
NOTE:
默认的方式,比如说open('filename')是读模式
r+, 则表示可读写
如果是二进制文件或图形文件,则必须用缓冲模式
普通的w模式会覆盖文件的内容,a模式则不会.
rb则可以用来读取二进制文件.
通过参数模式中使用U参数,能够在打开文件时使用通用的换行符支持模式,无论\r,\n\r,都会换成\n,而不用考虑运行的平台.
3)缓冲
0或者False: 无缓冲,所有操作直接针对硬盘
1或者True: 有缓冲,内存代替硬盘,速度快,只有close,flush才写入硬盘同步.
> 1 : 表示缓冲区的大小
-1 : 表示默认的缓冲区大小
2.文件方法
2.1 读写
#对空文件来说: 提供写时,会在已在字符串末尾追加,
1 >>> f = open('somefile.txt','w') 2 >>> f.write('Hello,') 3 >>> f.write('World!') 4 >>> f.close() 5 #somefile.txt文件内容 6 Hello,World!
#对于非空文件:提供w方法时,会覆盖文件中的内容
1 >>> f = open('somefile','w') 2 >>> f.write('This is 1st line.\n') 3 >>> f.write('This is 2nd line.') 4 >>> f.close() 5 #somefile.txt文件内容 6 This is 1st line. 7 This is 2nd line.
简单读取的例子:
1 >>> f = open('somefile.txt','r') 2 >>> f.read(16)#先读取16个字符 3 'This is 1st line' 4 >>> f.read() #会读取剩下的内容,除非seek定位到0,重新读取 5 '.\nThis is 2nd line.' 6 >>> f.close()
2.2 管道输出
$ cat somefile.txt | python somescript.py | sort
#一个简单例子: 统计一个文本中单词的数量
$ cat somefile.txt This is a book! That is a dog! Who are you?
脚本清单:
#somescript.py import sys text = sys.stdin.read() #读取所以输入 words = text.split() #分割字符串 print "Word Count:", len(words)
输出结果:
# cat somefile.txt | python somescript.py Word Count: 11
2.3 读写行
readline : 读取行,包括换行符 readlines: 读取所有行 write: 写一行, 注意:没有writeline方法 writelines: 写多行
NOTE: 如何判断不同的行以什么结尾? os.linesep
#UNIX >>> import os >>> os.linesep '\n' #WINDOWS >>> import os >>> os.linesep '\r\n'
2.4 基本文件方法
#测试文本somefile.txt
Welcome to this file There is nothing here except This stupid haiku
#首先读取指定字符 —— f.read(n)
>>> f = open(r'd:\Learn\Python\somefile.txt') >>> f.read(7) 'Welcome' >>> f.read(4) ' to ' >>> f.close()
#其次读取所有的行—— f.read()
>>> f = open(r'd:\Learn\Python\somefile.txt','r') >>> print f.read() Welcome to this file There is nothing here except This stupid haiku
#接着是读取行 —— f.readline()
>>> f.close() >>> f = open(r'd:\Learn\Python\somefile.txt') >>> for i in range(3): ... print str(i) + ':' + f.readline() ... 0:Welcome to this file 1:There is nothing here except 2:This stupid haiku
#再读取所有行 —— f.readlines()
>>> import pprint >>> pprint.pprint(open('somefile.txt').readlines()) ['Welcome to this file\n', 'There is nothing here except\n', 'This stupid haiku']
#下面是写文件—— f.write(' ......')
>>> f = open(r'somefile.txt','w') >>> f.write('this\nis no\nhaiku') >>> f.close() 运行文件后,内容如下: this is no haiku
#最后是writelines—— f.writelines( ' ....' )
>>> f = open(r'somefile.txt') >>> lines = f.readlines() >>> f.close() >>> lines[1] = "isn't a\n" >>> f = open('somefile.txt','w') >>> f.writelines(lines) >>> f.close() 运行后,文件内容如下: this isn't a haiku
2.5 关闭文件
时刻记得close()来关闭文件,这样做的目的:
安全考虑,防止文件因为某些原因崩溃,写不进数据
出于数据同步考虑,close(),才会往硬盘中写数据
出于效率的考虑,内存中的数据可清空一部分出来
为了确保程序结束时close(),可以用try/finally结合使用
# Open your file here try: # Write data to your file finally: file.close()
NOTE: 一般文件在close()之后才会写入硬盘,如果想不执行close()方法,又可以看到写入的内容,那么flush就派上用场了.
3.对文件内容迭代
3.1 按字节处理
def process(string): print 'Processing...', string f = open('somefile.txt') while True: char = f.read(1) if not char: break process(char) f.close()
3.2 按行处理
f = open(filename) while True: line = f.readline() if not line: break process(line) f.close()
3.3 读取所有内容
如果文件不是很大,可以用read(),或者readlines()读取的内容作为字符串来处理.
#用read来迭代每个字符
f = open(r'D:\Work\Python\somefile.txt') for char in f.read(): process(char) f.close()
#用readlines来迭代行
f = open(r'D:\Work\Python\somefile.txt','r') for line in f.readlines(): process(line) f.close()
3.4 使用fileinput懒惰型迭代
在需要对一个大文件进行迭代时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法来替代。
import fileinput def process(string): print 'Processing...', string for line in fileinput.input('somefile.txt'): process(line)
3.5 文件迭代器
#Python中文件是可以迭代的
f = open('somefile.txt') for line in f: print line, f.close()
#如果希望Python来完成关闭的动作,对文件进行迭代,而不使用变量存储变量,代码可以更加精简
for line in open('somefile.txt'): print line,
#sys.stdin也是可以迭代的
import sys for line in sys.stdin: print line, 运行结果: D:\Work\Python>python file.py #输入下面两行 Hello,World! Hello,Jerry! ^Z #按下CTRL+Z键后,输入的内容,显示 Hello,World! Hello,Jerry!
#可以对文件迭代器执行和普通迭代器相同的操作。比如将它们转换为字符串列表,这样所达到的效果和使用readlines一样.
>>> f = open('somefile.txt','w') >>> f.write('First line\n') >>> f.write('Second line\n') >>> f.write('Third line\n') >>> f.close() >>> lines = list(open('somefile.txt')) >>> lines ['First line\n', 'Second line\n', 'Third line\n'] >>> first,second,third = open('somefile.txt') >>> first 'First line\n' >>> second 'Second line\n' >>> third 'Third line\n'