详解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 psutil模块简单使用实例
Apr 28 Python
Python中title()方法的使用简介
May 20 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
python如何将两个txt文件内容合并
Oct 18 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
浅谈Python协程
Jun 17 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
详解python中的异常和文件读写
Jan 03 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的Yii框架中的属性(Property)
2016/03/18 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
图片之间的切换
2006/06/26 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
python解析文件示例
2014/01/23 Python
pycharm 使用心得(三)Hello world!
2014/06/05 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
AJAX都有哪些有点和缺点
2012/11/03 面试题
英文简历自荐信范文
2013/12/11 职场文书
季度思想汇报
2014/01/01 职场文书
教学实习自我评价
2014/01/28 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
城市创卫标语
2014/06/17 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
2014年技术员工作总结
2014/11/18 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers