详解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函数帮助查询小工具
Mar 13 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
微信跳一跳python代码实现
Jan 05 Python
Python实现屏幕截图的两种方式
Feb 05 Python
便捷提取python导入包的属性方法
Oct 15 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
Sep 16 Python
python的range和linspace使用详解
Nov 27 Python
Python如何安装第三方模块
May 28 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
如何使用flask将模型部署为服务
May 13 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
用PHP产生动态的影像图
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
通过修改referer下载文件的方法
2008/05/11 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
毕业生个人投资创业计划书
2014/01/04 职场文书
农村改厕实施方案
2014/03/22 职场文书
寄语是什么意思
2014/04/10 职场文书
春节联欢会策划方案
2014/05/16 职场文书
学校运动会广播稿
2014/10/11 职场文书
世界遗产的导游词
2015/02/13 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis