python文件打开方式详解——a、a+、r+、w+区别

来源:互联网 发布:云计算数据中心 用电 编辑:程序博客网 时间:2024/05/19 20:48


转载请注明出处: http://blog.csdn.net/ztf312/


第一步 排除文件打开方式错误:

r只读,r+读写,不创建

w新建只写,w+新建读写,二者都会将文件内容清零

(以w方式打开,不能读出。w+可读写)

**w+与r+区别:

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

r+与a+区别:

[python] view plain copy
  1. fd = open("1.txt",'w+')  
  2. fd.write('123')  
  3. fd = open("1.txt",'r+')  
  4. fd.write('456')  
  5. fd = open("1.txt",'a+')  
  6. fd.write('789')  

结果:456789

说明r+进行了覆盖写。

以a,a+的方式打开文件,附加方式打开

a附加写方式打开,不可读;a+: 附加读写方式打开)

以 'U' 标志打开文件, 所有的行分割符通过 Python 的输入方法(例#如 read*() ),返回时都会被替换为换行符\n. ('rU' 模式也支持 'rb' 选项) . 

r和U要求文件必须存在

不可读的打开方式w和a

若不存在会创建新文件的打开方式:a,a+,w,w+

[python] view plain copy
  1. >>> fd=open(r'f:\mypython\test.py','w')    #只读方式打开,读取报错  
  2. >>> fd.read()  
  3. Traceback (most recent call last):  
  4.   File "<stdin>", line 1in <module>  
  5. IOError: File not open for reading  
  6. >>> fd=open(r'f:\mypython\test.py','a')#附加写方式打开,读取报错  
  7. >>> fd.read()  
  8. Traceback (most recent call last):  
  9.   File "<stdin>", line 1in <module>  
  10. IOError: File not open for reading  
  11. >>></span></span></span>  
2.正确读写方式打开,出现乱码
[python] view plain copy
  1. >>> fd=open(r'f:\mypython\test.py','a+')  
  2. >>> fd.write('123')  
  3. >>> fd.read()  
  4. >>> fd.close()  
close之前,手动打开文件,什么都没写入;close后,手动打开文件,乱码:123嚅?     

原因分析:指针问题。open()以a+模式开启了一个附加读写模式的文件,由于是a,所以指针在文件末尾。此时如果做read(),则Python发现指针位置就是EOF,读取到空字符串。

在写入123之后,指针的位置是4,仍然是文件尾,文件在内存中是123[EOF]

但看起来read()的时候,Python仍然去试图在磁盘的文件上,将指针从文件头向后跳3,再去读取到EOF为止。

也就是说,你实际上是跳过了该文件真正的EOF,为硬盘底层的数据做了一个dump,一直dump到了一个从前存盘文件的[EOF]为止。所以最后得到了一些根本不期待的随机乱字符,而不是编码问题造成的乱码。

解决方案:读取之前将指针重置为文件头(如果读取之后重置再读,无效)

[python] view plain copy
  1. >>> fd=open(r'f:\mypython\test.py','a+')  
  2. >>> fd.seek(0)  
  3. >>> fd.read()  
  4. '123'<span style="white-space:pre">           </span>#顺利读出</span></span>  
3.文件里有内容,却读出空字符
[python] view plain copy
  1. >>> fd=open(r'f:\mypython\test.py','w+'#清空内容,重新写入  
  2. >>> fd.write('456')  
  3. >>> fd.flush()<span style="white-space:pre">     </span>#确定写入,此时文件内容为“456”  
  4. >>> fd.read()  
  5. '' #读出空  
原因:同样是指针问题,写入后指针指向末尾[EOF],因此读出空

解决方案一、调用close后重新打开,指针位于开头。(r,r+,a+,U都可以,注意不要用w,w+,a打开)

[python] view plain copy
  1. >>> fd.close()  
  2. >>> fd=open(r'f:\mypython\test.py','a+')  
  3. >>> fd.read()  
  4. '456'  
  5. >>> fd.close()  
  6. >>> fd=open(r'f:\mypython\test.py','r+')  
  7. >>> fd.read()  
  8. '456'<pre name="code" class="python">>>> fd.close()  
  9. >>> fd=open(r'f:\mypython\test.py','r')  
  10. >>> fd.read()  
  11. '456'  
  12. >>> fd.close()  
  13. >>> fd=open(r'f:\mypython\test.py','U')  
  14. >>> fd.read()  
  15. '456'  

解决方案二、调用seek指向开头
[python] view plain copy
  1. >>> fd=open(r'f:\mypython\test.py','w+')  
  2. >>> fd.write('456')  
  3. >>> fd.seek(0)  
  4. >>> fd.read()  
  5. '456'  

seek函数

    seek(offset[, whence]) ,offset是相对于某个位置的偏移量。位置由whence决定,默认whence=0,从开头起;whence=1,从当前位置算起;whence=2相对于文件末尾移动,通常offset取负值。

4. 记得close()关闭

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 统招专科学校 统招专升本学费 统招专升本难考吗 怎么报考统招专升本 买统招本科毕业证 自考本科和统招本科 统招大专和自考本科 统招专升本什么时候报名 统招专升本和自考专升本 统招和自考区别 统招专升本流程 统招专升本要考哪些科目 专升本统招和自考的区别 统招毕业证查询 培养方式统招 统招专升本考什么科目 统招专升本要考什么 统招专升本的要求 统招本科以上学历 全日制统招本科毕业证 统招专升本什么时候考试 同济大学统招专升本 全日制统招大专是什么意思 统招专升本试卷 成人大专升统招本科 统招本科及以上学历 五年制大专是统招吗 专升本算不算统招 自考专升本和统招专升本 自考学位证和统招学位证区别 统揽四个伟大 统方 统景温泉 重庆统景温泉风景区 统景风景区 统景 统景蹦极 重庆统景温泉酒店 统景温泉1日游攻略 统景泡温泉多少钱 统景景区内酒店