详解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下如何让web元素的生成更简单的分析
Jul 17 Python
Python 连连看连接算法
Nov 22 Python
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Python 变量类型详解
Oct 10 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
python numpy中cumsum的用法详解
Oct 17 Python
PyTorch加载自己的数据集实例详解
Mar 18 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
Python中的xlrd模块使用整理
Jun 15 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程序的方法
2009/03/09 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
jQuery动态添加
2016/04/07 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
loading动画特效小结
2017/01/22 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python显示进度条的方法
2014/09/20 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
python八皇后问题的解决方法
2018/09/27 Python
python的依赖管理的实现
2019/05/14 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
经济学博士求职自荐信范文
2013/11/23 职场文书
公司运动会策划方案
2014/05/25 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
初一英语教学反思
2016/02/15 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
利用Redis实现点赞功能的示例代码
2022/06/28 Redis