关于python的open函数的误区。

来源:互联网 发布:java防止接口频繁调用 编辑:程序博客网 时间:2024/05/29 17:58

前段日子看了关于python文件和流的一些文献,其中最基础的便是python的一个内建函数:open!!!

很简单的一个函数,他的原型是这样的:

open(name,[,mode[,buffering]])

顾名思义,name参数指的就是文件名,mode是模式参数,buffering是控制缓冲参数,后两个为可选参数。open函数会返回一个文件对象。

for example:

>>> f = open('myfile.txt')

这样就可以打开当前目录下的myfilef.txt文件。这里举的例子是相对当前目录的路径,当然文件路径也可以是绝对路径(windows中为C:\,Linux or Unix下则是~/)。


今天我想和大家讲的就是这个函数的参数使用上的问题,当然我只是一个大一学生,一个python菜鸟,我希望热爱python的大神们能为我解疑,我只是和大家分享我的看法,想法,以后每次发表的博客也都一样,我希望能和跟多热爱python的大家多交流,多借鉴,学习,无论是和我一样的菜鸟还是python大神。好了,进入正题,Let's go!


open函数的第一个参数不必说。

第二个参数(mode):常用值有' r ',' w ',' a ',' b ',' + ',分别是读模式,写模式,追加模式,二进制模式,读写模式。其中' b ',' + '能能加到其他模式中,举个例子:比如' rb '读取二进制文件,' r+ '可以进行读写文件。

好了,我要讲的就是open的第三个参数!buffering!

buffering的英文意思是缓冲!(虽然我的英语差到极点哭但是每次看到代码中不动的英文单词总喜欢先查一下他的英文意思生气)从他的英文含义就可以大概知道他就是控制缓冲的参数。

如果参数为0(或是布尔值的False),I/O就是无缓冲的。

如果参数为1(或是布尔值的True),I/O就是有缓冲的。

如果参数为大于1的数字,则此值代表缓冲区的大小(单位是字节);如果为-1或是任何负数,则表示使用默认的缓冲区大小。


这样理解完,似乎很简单,不就是当参数为0或False时输入输出无缓冲,否则就有缓冲,而且大于1的数表示缓冲区大小,负数则使用默认缓冲区大小吗。

for example:

现在我的当前目录下有个myfile.txt文件。进入python交互式:

>>> f = open( ' myfile.txt ' , ' w ' , 0 )#这时进入无缓冲的写模式

>>> f.write( ' I love python! ' )#这时在另一个终端用cat查看下文件内容,就可以查看到 I love python!

>>> f = open( ' myfile.txt ' , ' w ' , 1 )#这时进入有缓冲的写模式

>>> f.write( ' I love python! ' )#这时在另一个终端查看时文件内容为空

>>> f.close()#这时再次查看,就可以看到 I love python!

前面的很好理解,因为后者是有缓冲的嘛,需要close或者flush才能写入磁盘。但是如果参数是第三种情况的话呢,也就是大于一或是一个负数,即自己设置缓冲区大小。以前我一直觉得这不就是有缓冲吗,设置个缓冲区大小嘛,一旦超过缓冲区大小就直接写入磁盘或者报错啥的呗,是不是也有很多人也这么想的呢。

But!前几天一次偶然,我发现并不是这样,然后我在此思考,尝试好几天,网上也似乎没有关于这个问题的解疑解答。但我希望大家知道这个关于open函数的第三个函数的这个情况就好。


for example:

>>> f = open( ' myfile.txt ' , ' w ' , 100)#这时进入有缓冲的,缓冲区大小为100字节的写模式

>>> f.write( ' Life is short , Use Python! ' )#内容远小于缓冲区大小没错,理论上这时文件内容应该为空,但是现实残酷,我竟然cat到了Life is short,Use   Python!!!惊恐

各种尝试,查阅,总结。我认为事实上当你为缓冲区设置大小时,open进入的却是无缓冲模式。


当时我一直使用的是Ubuntu15.10下的python2.7.10。后来我用os下的python2.7.8试了多次,发现却是我以前理解的那样,确实进去了有缓冲的模式,并自己设置了缓冲区大小。


所以希望大家能自己简单测试一下,并将结果告诉我,希望大神能给小弟解疑答惑委屈,菜鸟能和小弟一起交流学习,共同迈向python大神之路!微笑

2 0