详解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操作excel文件的实例代码
Oct 15 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
flask中过滤器的使用详解
Aug 01 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
django为Form生成的label标签添加class方式
May 20 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Python提取PDF指定内容并生成新文件
Jun 09 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
帅气的琦玉老师
2020/03/02 日漫
php代码把全角数字转为半角数字
2007/12/10 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Django框架封装外部函数示例
2019/05/28 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
详解python中__name__的意义以及作用
2019/08/07 Python
python关于倒排列的知识点总结
2020/10/13 Python
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
外语系毕业生求职自荐信
2014/04/12 职场文书
12岁生日演讲稿
2014/05/14 职场文书
创文明城市标语
2014/06/16 职场文书
浅析Python中的随机采样和概率分布
2021/12/06 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript