详解Python中open()函数指定文件打开方式的用法
admin
2023-08-02 06:57:05
0

文件打开方式

当我们用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\’。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...