详解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随机生成一个6位的验证码代码分享
Mar 24 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
用python写扫雷游戏实例代码分享
May 27 Python
Python 面试中 8 个必考问题
Nov 16 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python aiohttp的使用详解
Jun 20 Python
Django用户认证系统 User对象解析
Aug 02 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Python3中FuzzyWuzzy库实例用法
Nov 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
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
使用Python的PEAK来适配协议的教程
2015/04/14 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
求职信模板怎么做
2014/01/26 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
倡议书怎么写?
2019/04/11 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
导游词之唐山景点
2019/12/18 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
openstack云计算keystone组件工作介绍
2022/04/20 Servers
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server