首页 > 技术文章 > python 基础 3.1 打开文件 a a+ r+ w+ 详解

lzcys8868 2017-10-27 14:18 原文

 
一.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()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

推荐阅读