详解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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
python实现文件名批量替换和内容替换
Mar 20 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
TensorFlow实现MLP多层感知机模型
Mar 09 Python
利用Python如何批量更新服务器文件
Jul 29 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
python多进程并发demo实例解析
Dec 13 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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
yii框架源码分析之创建controller代码
2011/06/28 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python中list初始化方法示例
2016/09/18 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
python的concat等多种用法详解
2018/11/28 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
Numpy之reshape()使用详解
2019/12/26 Python
Python如何实现邮件功能
2020/05/27 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
职业生涯规划书前言
2014/04/15 职场文书
高一作文之乐趣
2019/11/21 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android