详解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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
Python中动态创建类实例的方法
Mar 24 Python
用python制作游戏外挂
Jan 04 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
python 拼接文件路径的方法
Oct 23 Python
python抖音表白程序源代码
Apr 07 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
python 实时调取摄像头的示例代码
Nov 25 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中使用redis队列操作实例代码
2013/02/07 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
Add a Table to a Word Document
2007/06/15 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
python实现将内容分行输出
2015/11/05 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python