详解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万年历实现代码 含运行结果
May 20 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Pycharm 设置自定义背景颜色的图文教程
May 23 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
Python定义函数功能与用法实例详解
Apr 08 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python tkinter图形界面代码统计工具
Sep 18 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
详解python常用命令行选项与环境变量
Feb 20 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
教你如何用Python实现人脸识别(含源代码)
Jun 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版
2012/04/20 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python实现支付宝转账接口
2019/05/07 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
关于VPN
2012/06/10 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
开办饭店创业计划书
2013/12/28 职场文书
学生生病请假条范文
2014/02/16 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
解析Java中的static关键字
2021/06/14 Java/Android
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技