详解Python中open()函数指定文件打开方式的用法
作者:mattkang 发布时间:2022-12-07 10:22:11
文件打开方式
当我们用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'。


猜你喜欢
- 目录1. 配置Python环境变量2. 安装Python编辑器,并在其中配置Python3. 安装控制包uiautomator2,和其它辅助
- 总体顺序确定需要安装的tensorflow-gpu版本,点击这里拉到最下方,一般是cuda10和cudnn7.4,以及对应的nvidia驱动
- 本文实例讲述了Python实现截屏的函数。分享给大家供大家参考。具体如下:1.可指定保存目录.2.截屏图片名字以时间为文件名3.截屏图片存为
- 按位与或(&、|、^):按照二进制进行逻辑运算例如:数字换成二进制,各自位上的0/1进行逻辑运算,得到的结果转换为数字3 &
- 中间件是什么?中间件是类似flask函数中钩子函数的东西。可以在请求视图函数前,或者视图函数响应后处理某些事情。中间件对全部视图都有效!中间
- Numpy在python中属于非常常用的包,无论是机器学习搭配pandas,还是数据可视化搭配pylab都是很正常的搭配。Numpynump
- 用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。首先,实现一个简单的上传(过程中未做任何处理,只
- Python input()函数Python input()函数教程在 Python 中,input() 函数用于获取用于的输入,并给出提示
- 模板的继承完美在写html的时候会发现,自己多个html文件中又好多东西是一样的,包括静插件的引入 还有有些简单的css样式都不需要修改,这
- 六步安装Mysql(免安装包的才可以选安装位置),供大家参考,具体内容如下第一步:下载MySQL压缩包mysql下载路径直接点击链接也可以下
- python3.7 使用pymssql往sqlserver插入数据import pymssqlconn = pymssql.connect(
- 1.创建一个项目django-admin.py startproject HelloWorld2.进入HelloWorld项目,在manag
- 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个
- Vue3 新的发展方向(来源于尤大知乎)Vue 3 将在 2022 年 2 月 7 日 成为新的默认版本基于 Vite 的极速构建工具链&l
- 前言一段时间没有用Union和Union,再用的时候忘了怎么用了。。。所以做一篇文章来记录自己学Union和Union的经历。提前准备在Sq
- 前序在Python中,集合(Set) 是一个无序、不重复的序列,它不支持索引。集合一般用于元素去重或者一些数学中的操作像union,inte
- plt.plot()函数各参数解析plt.plot()函数的作用是绘制折线图,它的参数有很多,常用的函数参数如下:plt.plot(x,y,
- 目录一.准备工作二.预览1.启动2.添加城市3.展示多个城市天气三.设计流程1.获取城市天气信息过程四.源代码1.Weather_Tool-
- 用到的 Pygame 函数贪吃蛇小游戏用到的函数 功能描述init()初始化 pygamedisplay.set_mode()以元
- 如下所示:#!/usr/bin/env pythonimport serialimport timeimport threadclass M