详解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中的二叉树查找算法模块使用指南
Jul 04 Python
用Python遍历C盘dll文件的方法
May 06 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Python实现插入排序和选择排序的方法
May 12 Python
详解Python的三种拷贝方式
Feb 11 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
python执行js代码的方法
May 13 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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 DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
js+xml生成级联下拉框代码
2012/07/24 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python实现图片转字符画的示例
2017/08/22 Python
Python使用folium excel绘制point
2019/01/03 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
解析python的局部变量和全局变量
2019/08/15 Python
Django发送邮件功能实例详解
2019/09/02 Python
wxPython色环电阻计算器
2019/11/18 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
python 伯努利分布详解
2020/02/25 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
财务人员求职自荐书范文
2014/02/10 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
个人贷款收入证明
2014/10/26 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技