详解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字符串替换示例
Apr 24 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
简单了解python代码优化小技巧
Jul 08 Python
Python 转换文本编码实现解析
Aug 27 Python
python中调试或排错的五种方法示例
Sep 12 Python
python使用PIL剪切和拼接图片
Mar 23 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 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
php删除左端与右端空格的方法
2014/11/29 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
php扩展开发入门demo示例
2019/09/23 PHP
简明json介绍
2008/09/28 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
js实现一个简易计算器
2020/03/30 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python创建和使用字典实例详解
2013/11/01 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python笔试面试题小结
2019/09/07 Python
Python实现点云投影到平面显示
2020/01/18 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
应届生会计求职信
2013/11/11 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python