详解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删除列表内容
Aug 04 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
python僵尸进程产生的原因
Jul 21 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
使用python脚本实现查询火车票工具
Jul 19 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
详解Python中的测试工具
Jun 09 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
什么是python的必选参数
Jun 21 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
python 爬取免费简历模板网站的示例
Sep 27 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 使用post,get的一种简洁方式
2010/04/25 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
javascript 回调函数详解
2014/11/11 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
如何解决python多种版本冲突问题
2020/10/13 Python
python里glob模块知识点总结
2021/01/05 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
满月酒主持词
2014/03/27 职场文书
求职信的正确写法
2014/07/10 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
就业协议书范本
2014/10/08 职场文书
大学开学感言
2015/08/01 职场文书
导游带团欢迎词
2015/09/30 职场文书