在python的内置open()函数中缓冲的用途是什么?

Sri*_*hnu 33 python python-2.7

Python文档:https://docs.python.org/2/library/functions.html#open

open(name[, mode[, buffering]])  
Run Code Online (Sandbox Code Playgroud)

上面的文档说"可选的缓冲参数指定文件所需的缓冲区大小:0表示无缓冲,1表示行缓冲,任何其他正值表示使用(大约)该大小的缓冲区(以字节为单位).负缓冲意味着使用系统默认.如果省略,则使用系统默认值."
我用的时候

filedata = open(file.txt,"r",0)  
Run Code Online (Sandbox Code Playgroud)

要么

filedata = open(file.txt,"r",1)  
Run Code Online (Sandbox Code Playgroud)

要么

filedata = open(file.txt,"r",2)
Run Code Online (Sandbox Code Playgroud)

要么

filedata = open(file.txt,"r",-1) 
Run Code Online (Sandbox Code Playgroud)

要么

filedata = open(file.txt,"r")
Run Code Online (Sandbox Code Playgroud)

输出没有变化.上面显示的每条线以相同的速度打印.
输出:

憨豆先生是英国电视节目系列十五25-

罗宾·德里斯科尔和罗恩·阿特金森主演的分钟剧集

标题字符.罗宾也写了不同的剧集

Driscoll和Richard Curtis以及Ben Elton的一个.十三个

从1990年1月1日的飞行员到ITV,在ITV上播放了这些剧集

1995年10月31日"晚安憨豆先生".一个剪辑节目,"最好的比特

憨豆先生于1995年12月15日播出,其中一集是"Hair by

憨豆先生"直到2006年才在Nickelodeon播出.

那么open()函数中的缓冲参数如何有用呢?什么价值

那个缓冲参数最好用吗?

Asa*_*din 32

启用缓冲意味着您不直接与OS的文件表示或其文件系统API连接.相反,只有一大块数据从原始OS文件流中读取到缓冲区中,直到消耗完为止,此时将更多数据提取到缓冲区中.根据您获得的对象,您将获得一个BufferedIOBase包装底层对象RawIOBase(表示原始文件流)的对象.

这有什么好处?与原始流接口良好可能具有高延迟,因为操作系统必须使用硬盘等物理对象,并且在许多情况下可能不适合.假设您希望每5ms读取一个文件中的三个字母,并且您的文件位于硬盘旧硬盘上,甚至是网络文件系统中.不是每隔5ms尝试从原始文件流中读取,最好将一堆文件加载到内存中的缓冲区中,然后随意使用它.

您选择的缓冲区大小取决于您使用数据的方式.对于上面的示例,1个字符的缓冲区大小将是糟糕的,3个字符将是正常的,并且3个字符的任何大的倍数不会导致用户明显的延迟将是理想的.


N R*_*awa 10

您还可以通过从io模块调用只读DEFAULT_BUFFER_SIZE属性来检查默认缓冲区大小.

import io
print (io.DEFAULT_BUFFER_SIZE)
Run Code Online (Sandbox Code Playgroud)

  • 尽管这可以回答作者的问题,但它缺少与文档的链接。请修改您的答案。 (2认同)

Sim*_*mic 6

从实际角度来看,也许重要的是缓冲参数决定了发送到流的数据何时实际保存到磁盘。

当您在没有缓冲参数的情况下打开文件并向其中写入一些内容时,您将看到仅在退出块后(或调用with open(...) as foo:文件的方法时),或者当某些系统确定的默认缓冲区大小为到达。但如果设置该参数,一旦达到缓冲区的大小,它将立即写入数据。close()buffering

因此,open('file.txt', 'w', buffering=1)当您有一个长时间运行的应用程序,并且您要将一些数据发送到文件,并且您希望它在每一行之后保存,而不仅仅是在应用程序退出之后保存时,使用 ie 是一件有用的事情。否则,崩溃、断电等可能会导致数据丢失。

另请参阅:python 多久刷新一次文件?