详解Python中open()函数指定文件打开方式的用法


Posted in Python onJune 04, 2016

文件打开方式

当我们用open()函数去打开文件的时候,有好几种打开的模式。

'r'->只读
'w'->只写,文件已存在则清空,不存在则创建。
'a'->追加,写到文件末尾
'b'->二进制模式,比如打开图像、音频、word文件。
'+'->更新(可读可写)

这个带'+'号的有点难以理解,上代码感受下。

with open('foo.txt', 'w+') as f: 
  f.write('bar\n') 
  f.seek(0)  
  data = f.read()

可以看到,上面这段代码,它不但可以写,还可以读出来。注意要先定位到开头,f.seek(0),不然读出来的是空数据。
一些人可能会有迷惑,既然带'+'号是可读可写,那'w+'跟'r+'有什么不同。
那就是,
'w+'会清空,会创建 (文件已存在则清空,不存在则创建。)
'r+'不清空,不创建

不要用二进制模式打开文本文件
先看下面代码的“诡异”现象。
假设在windows下,我有个f.txt文件,里面的内容是下面这样的。

hello
world

代码一,

with open('f.txt', 'r') as f: 
  print f.readlines() 
with open('f.txt', 'rb') as f: 
  print f.readlines()

输出

['hello\n', 'world\n']
['hello\r\n', 'world\r\n']

代码二,

with open('f.txt', 'rb') as f: 
  data = f.read() 
with open('f.txt', 'w') as f: 
  f.write(data)

打开文件,变成了下面这样,

hello^M
world^M

首先,先理解换行符'\n'跟回车符'\r'的概念。
'\n',换行符(LF,Line-Feed ),指新的一行。
'\r',回车符(CR,Carriage-Return),指回到行头。

因为在不同系统下的换行标识是不一样的。

windows->'\r\n'
unix->'\n'
mac->'\r'

这就是为什么windows下的txt在linux打开的时候行尾会有'^M'。
这就是为什么我在linux下跑脚本导出游戏数据下到本地windows打开变成了一行。

其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。

在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是'\r\n'。
在python中操作换行标识的时候,并不用管是在什么平台下,直接用'\n'就行了,python会自动根据不同系统转成不同标识。

有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。
代码一中,用文本模式打开的文件,换行标识会被python处理成'\n',而用二进制模式打开则原封不动。
代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是'\r\n',而文本模式写入的时候因为python会把'\n'转成'\r\n',所以其实就等于是写入了'\r\r\n',于是就多了个'^M'。

Python 相关文章推荐
python实现批量转换文件编码(批转换编码示例)
Jan 23 Python
浅析Python中的序列化存储的方法
Apr 28 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
用pandas按列合并两个文件的实例
Apr 12 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python搭建Spark分布式集群环境
Jul 05 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
Python读取二进制文件代码方法解析
Jun 22 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 #Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 #Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 #Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 #Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 #Python
详解字典树Trie结构及其Python代码实现
Jun 03 #Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 #Python
You might like
用文本文件制作留言板提示(上)
2006/10/09 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP使用函数用法详解
2018/09/30 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
python实现Zabbix-API监控
2018/09/17 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
Python Django 命名空间模式的实现
2019/08/09 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
企业车辆管理制度
2014/01/24 职场文书
感恩节活动方案
2014/01/27 职场文书
个人求职信范例
2014/01/29 职场文书
任命书范本大全
2014/06/06 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
文员岗位职责范本
2015/04/16 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python