详解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 相关文章推荐
Windows系统下多版本pip的共存问题详解
Oct 10 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
基于Django用户认证系统详解
Feb 21 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
使用 Python 实现文件递归遍历的三种方式
Jul 18 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
python 实现德洛内三角剖分的操作
Apr 22 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
如何打开php的gd2库
2017/02/09 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
python远程登录代码
2008/04/29 Python
Python中的getopt函数使用详解
2015/07/28 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Python守护进程实现过程详解
2020/02/10 Python
python实现邮件循环自动发件功能
2020/09/11 Python
本科生职业生涯规划书范文
2014/01/21 职场文书
教师自我鉴定范文
2014/03/20 职场文书
毕业自我鉴定书
2014/03/24 职场文书
先进班集体事迹材料
2014/12/25 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
催款律师函范文
2015/05/27 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang