详解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中使用装饰器时需要注意的一些问题
May 11 Python
python实现SMTP邮件发送功能
Jun 16 Python
如何利用Fabric自动化你的任务
Oct 20 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python安装twisted的问题解析
Aug 21 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
Python生成器常见问题及解决方案
Mar 21 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python怎么自定义捕获错误
Jun 29 Python
用Python实现屏幕截图详解
Jan 22 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
js DataSet数据源处理代码
2010/03/29 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
EL表达式截取字符串的函数说明
2017/09/22 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
旷课检讨书1000字
2014/02/14 职场文书
学校门卫岗位职责
2014/03/16 职场文书
保险公司早会主持词
2014/03/22 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android