python 基础 3.1 打开文件 a a+ r+ w+ 详解
一.python 访问文件
1.在python中要访问文件,首先要打开文件,也就是open
---open
r: 只读
w: 只写 ,文件已存在则清空,不存在则创建
a:追加 ,写到文件末尾。如果文件存在,则在文件最后去追加。文件不存在就
去创建
+-:更新(可读可写)
2.排除文件的错误打开方式
1》r, r+
r 只读
r+读写,不创建
r+:读写,不创建
with open(r'C:\Users\lzc\Desktop\234.txt','r+') as fd:
fd.write('oooo\nmmmm\nppppp')
>>> 应用r+读写模式打开文件,函数fd.write()可以把内容写到文件中
2》w,w+
w新建只写,w+ 新建读写 : 二者都会将文件内容清零(以w打开方式,不能读出,w+可读写)
w:只写不可读,文件存在。当读取一个文件时报错
with open(r'C:\Users\lzc\Desktop\234.txt','w') as fd:
fd.read()
>>> line 48, in <module>
fd.read()
IOError: File not open for reading
w+:可读写,文件存在。但是会把原文件清零
with open(r'C:\Users\lzc\Desktop\234.txt','w+') as fd:
fd.read()
>>> 应用w+ 打开文件,函数fd.read()可以读出文件内容,但是都会先清零,所以不会显示文件内容
3》w+ 与 r+ 区别:
r+: 可读可写,若文件不存在,报错
w+:可读可写,若文件不存在,创建
4》r+ 与 a+ 区别:
#r+ 与 a+ 区别
with open(r'C:\Users\lzc\Desktop\234.txt','w+') as fd:
fd.write('1111111\n')
with open(r'C:\Users\lzc\Desktop\234.txt','r+') as fd:
fd.write('222222\n')
with open(r'C:\Users\lzc\Desktop\234.txt','a+') as fd:
fd.write('333333\n')
>>> 222222
333333
说明,r+ 是覆盖写了。
4》不可读的打开方式:w和a
若不存在会创建新文件的打开方式:a , a+ ,w, w+
#不可读的打开方式w和a
fd = open(r'C:\Users\lzc\Desktop\234.txt','w')
print fd.read()
>>> IOError: File not open for reading
fd = open(r'C:\Users\lzc\Desktop\234.txt','a')
print fd.read()
>>> IOError: File not open for reading
#以正确的方式打开,出现乱码 w+ a+
fd = open('9.txt','a+')
fd.write('vvvvv\nbbbbb\n')
fd.read()
fd.close()
>>>
原因分析:指针问题。open() 以a+ 模式开启了一个附件读写模式的文件,由于是a,所以指针在文件末尾。此时如果做read(),则python发现指针位置就是EOF,读取到空字符串。在写入“vvvvbbbb”之后,指针的位置是9,仍然是我呢见尾,文件在内存中是vvvvbbbb[EOF]。但看起来read()的时候,python仍然去试图在读磁盘上的文件。将指针从我文件头向后跳3,再去读取到EOF为止。也就是说,你实际上是跳过了该文件真正的EOF,为硬盘底层的数据做了一个dump,一直dump到了一个从前存盘文件的EOF为止。所以最后得到了一些根本不期待的随机乱字符,而不是编码问题造成的乱码。
解决方法:读取之前将指针重置为文件头(如果读取之后重置在读,无效。)
fd = open('9.txt','a+')
fd.seek(0)
# fd.read()
fd.write('vvvvv\nbbbbb\n')
fd.close()
>>>
# "w+" 清楚文件内容后再重新写入
fd = open('9.txt','w+')
fd.write('789')
fd.flush()
fd.read()