文件读写
一, 打开和关闭文件
首先要对文件进行操作就要先打开一个文件, 以创建 file 对象, 然后才能对它进行读写等操作.
- #1. 打开: 使用 open 函数
- #2. 关闭: 使用 close 函数: 刷新缓冲区里任何还没有写入的信息, 并关闭文件, 之后便不可再对该文件进行读写.
- # 在 close 之前也可以调用 flush 方法刷新缓冲区
- # fil = open(文件名, 打开文件的模式, 缓冲区), 其中后面两个参数可以省略, 模式有读 (r), 写(w), 追加(a) 等,
- # 缓冲区(等于 0: 不会寄存, 等于 1: 寄存一行, 大于 1: 寄存区的缓存大小, 小于 0: 系统默认缓冲区大小)
二, 读取文件
在以'r'模式打开文件以后可以调用 read 函数一次性将文件里的内容全部读取出来, 也可以每次指定读取多少字节.
例子:
- fil1 = open('yyc.txt','r',-1) #读 文件必须存在(目前是当前目录下)
- # buff3 =fil1.read() #一次性读完
- buff4 =fil1.read(100) #读 100 个字节
- # print buff3+","+buff4 #这里如果先 read()再 read(100) 则 buff4 为空, 因为 read()已经读完整个文件了, 就像 c 中指针已经到最后了. 可以通过 fil1.tell()函数打印指针当前位置
- print buff4
- fil1.close() #关闭文件
三, 写文件
可以通过'w'的方式打开文件, 就可以创建一个可以写的文件对象. 如果文件存在则清空文件再写, 如果文件不存在则创建.
例子:
- fil = open('yyc.txt','w',-1) #写 如果文件存在则清空文件再写, 如果文件不存在则创建
- fil.write("123456hello")
- fil.flush() #写完最好刷新一下
- fil.close() #关闭文件
四, 读写文件 r+,w+
'r'模式打开的文件创建的对象只能用 read 函数读取文件的内容,'w'模式打开的文件又只能往里写内容. 如果想实现在一个文件关闭前既可以往里写内容, 又可以读取内容怎么办呢? 这就是'r+'和'w+'所实现的功能. 但是个人还是建议在一个文件打开关闭期间要么读要么写, 因为这样子会出现很奇怪的问题, 可仔细阅读下面的例子:
'w+'模式例子 1: 如果在打开文件和关闭文件之间先执行写操作然后读操作, 最后读出的内容为空.
- # 先写后读
- fil5 = open('yyc.txt',"w+",0) #既写又读 如果文件存在则先清空文件, 如果文件不存在则创建
- fil5.write('b') #先写入
- fil5.flush() #写完最好刷新一下
- buff2 =fil5.read() #因为此时指针指向写入内容的后面, 所以内容为空
- print 'w + 模式先写后读:'+buff2 #读出的内容是未覆盖的内容, 这里为空啦, 因为此时指针指向写入内容的后面, 即文档末尾
- fil5.close()
'w+'模式例子 2: 如果在打开文件和关闭文件之间先执行读操作然后写操作, 读出的内容也为空.
- # 先读后写
- fil5 = open('yyc.txt',"w+",0) #既写又读 如果文件存在则先清空文件, 如果文件不存在则创建
- buff2 =fil5.read() #由于清空了文件, 所以内容为空
- print 'w + 模式先读后写:'+buff2 #读出的内容是未覆盖的内容, 这里还没写写入, 所以为空
- fil5.write('123456') #
- fil5.flush() #写完最好刷新一下
- fil5.close()
从上面两个例子可以看出, 在以'w+'模式打开文件并同时执行读写操作时, 不管是先写后读还是先读后写, 读出的内容都是空, 但是其中的道理各有不同哦(代码注释里差不多也清楚了).
'r+'模式例子 1: 如果在打开文件和关闭文件之间先执行写操作然后读操作, 读出的内容是写入后未覆盖的内容
- # 先写后读
- fil3 = open('yyc.txt',"r+",-1) #既读又写 从文件开始位置覆盖内容
- fil3.write('66666')
- fil3.flush() #写完最好刷新一下
- buff2 = fil3.read() #必须先刷新再做读操作,
- print 'r + 模式先写后读:'+buff2 #读出的内容是未覆盖的内容, 因为指针在写入文件后指向了写入后的位置, 即文档末尾
- fil3.close()
'r+'模式例子 2: 如果在打开文件和关闭文件之间先执行读然后写操作, 运行报错.
- # 先读后写(报错)
- # fil3 = open('yyc.txt',"r+",-1) #既读又写 从文件开始位置覆盖内容
- # buff2 = fil3.read() #先读
- # print 'r + 模式先读后写:'+buff2 #输出的内容是覆盖后的内容, 也就是说他执行过 write 了? 很奇怪, 并且报错
- # # fil3.flush() #加不加效果一样
- # fil3.write('66666')# 后写
- # fil3.flush() #写完最好刷新一下
- # fil3.close()
五, 追加写入文件 a,a+
如果想保留文件现有内容, 只是把新内容加入原有文件的尾部或者说新增文件内容而不影响原有内容, 则可以用 a 或者 a + 模式.
'a+'模式例子 1: 如果在打开文件和关闭文件之间先执行写操作然后读操作, 最后读出的内容为空.
- # 先写后读
- fil6 = open('yyc.txt','a+',0) #追加 如果文件存在则追加内容, 如果文件不存在则创建
- fil6.write('1234') #
- fil6.flush() #写完最好刷新一下 , 查看文件写入成功
- print 'a + 模式先写后读:'+fil6.read() #但读出来是空, 因为此时指针指向写入内容的后面
- fil6.close() #关闭文件
'a+'模式例子 2: 如果在打开文件和关闭文件之间先执行读操作然后写操作, 读出的内容也为为空.
- # 先读后写
- fil6 = open('yyc.txt','a+',0) #追加 如果文件存在则追加内容, 如果文件不存在则创建
- print 'a + 模式先读后写:'+fil6.read() #但读出来是空
- fil6.write('1234') #
- fil6.flush() #写完最好刷新一下 , 查看文件写入成功
- fil6.close() #关闭文件
综上 6 个例子, 其实 r+,w+,a + 有异曲同工之处, 也就是文件指针指向的位置, 决定了读写的内容. 只要理解了指针在文件中的位置, 就不难理解文件的读写啦.
来源: http://www.bubuko.com/infodetail-2580876.html