文件打开方式
当我们用open()函数去打开文件的时候,有好几种打开的模式。
'r'->只读
这个带'+'号的有点难以理解,上代码感受下。
?
1
2
3
4
|
with
open
(
'foo.txt'
,
'w+'
) as f:
f.write(
'bar\n'
)
f.seek(
0
)
data
=
f.read()
|
可以看到,上面这段代码,它不但可以写,还可以读出来。注意要先定位到开头,f.seek(0),不然读出来的是空数据。
不要用二进制模式打开文本文件先看下面代码的“诡异”现象。
?
1
2
|
hello
world
|
代码一,
?
1
2
3
4
|
with
open
(
'f.txt'
,
'r'
) as f:
print
f.readlines()
with
open
(
'f.txt'
,
'rb'
) as f:
print
f.readlines()
|
输出
?
1
2
|
['hello\n', 'world\n']
['hello\r\n', 'world\r\n']
|
代码二,
?
1
2
3
4
|
with
open
(
'f.txt'
,
'rb'
) as f:
data
=
f.read()
with
open
(
'f.txt'
,
'w'
) as f:
f.write(data)
|
打开文件,变成了下面这样,
?
1
2
|
hello^M
world^M
|
首先,先理解换行符'\n'跟回车符'\r'的概念。
因为在不同系统下的换行标识是不一样的。
?
1
2
3
|
windows->'\r\n'
unix->'\n'
mac->'\r'
|
这就是为什么windows下的txt在linux打开的时候行尾会有'^M'。
其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。
在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是'\r\n'。
有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。