详解Python中open()函数指定文件打开方式的用法
当我们用open()函数打开文件时,有几种打开模式。
'r'->只读 'w'->只写,如果文件已经存在,则清空,如果不存在,则创建。 'a'->追加,写到文件末尾 'b'->打开图像、音频、word文件等二进制模式。 '+'->更新(可读可写)
这个带'+'数字有点难以理解,在代码的感觉下。
withopen('foo.txt','w+')asf: f.write('bar\n') f.seek(0) data=f.read()
可以看出,上面的代码不仅可以写,还可以读。注意先定位到开头,f.seek(0),否则会读出空数据。
有些人可能会感到困惑,因为他们带'+'数字是可读可写的,那'w+'跟'r+'有什么不同?
那就是,
'w+'会清空,会创造 (如果文件已经存在,则清空,如果不存在,则创建。)
'r+'不清空,不创造
不要用二进制模式打开文本文件
先看下面代码的“怪异”现象。
假设在windows下,我有一个f.txt文件,内容如下。
hello
world
代码一
withopen('f.txt','r')asf: printf.readlines() withopen('f.txt','rb')asf: printf.readlines()
输出
['hello\n','world\n'] ['hello\r\n','world\r\n']
代码二
withopen('f.txt','rb')asf: data=f.read() withopen('f.txt','w')asf: 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将根据不同的系统自动转换为不同的标志。
通过以上理论依据,可以分析本文开头代码的“奇怪”现象。
在代码1中,python将用文本模式打开的文件处理为'\n',而且用二进制模式打开就原封不动了。
代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是'\r\n',在写入文本模式时,因为python会将'\n'转成'\r\n',所以其实就等于写了'\r\r\n',所以多了一个'^M'。