前段日子看了关于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试了多次,发现却是我以前理解的那样,确实进去了有缓冲的模式,并自己设置了缓冲区大小。


所以希望大家能自己简单测试一下,并将结果告诉我,希望大神能给小弟解疑答惑