当我们使用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会根据不同的系统自动转换成不同的标记。
有了以上的理论基础,我们就可以分析本文开头代码的“怪异”现象了。
代码1中,对于以文本方式打开的文件,换行符会被python处理为'\n',但以二进制方式打开时,换行符将保持不变。
代码2中,以二进制方式打开,以文本方式写入。 binary打开的时候还是'\r\n',而用文本方式写的时候,因为python会把'\n'转成'\r\n',所以其实相当于写'\r\r ' \n',所以多了一个'^M'。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python中argparse库是什么09/29
- ♥ Python正则表达式字符串的组成11/20
- ♥ python如何处理txt09/30
- ♥ 如何在python中清空数组(列表)元素08/19
- ♥ python是收费的还是免费的09/11
- ♥ sublime可以写python吗11/21
内容反馈