[英]What is the use of opener argument in built-in open() function?
[英]What is the use of buffering in python's built-in open() function?
Python 文档: https://docs.python.org/2/library/functions.html#open
open(name[, mode[, buffering]])
上面的文档说“可选的缓冲参数指定文件所需的缓冲区大小:0 表示无缓冲,1 表示行缓冲,任何其他正值表示使用(大约)该大小(以字节为单位)的缓冲区。负缓冲意味着使用系统默认值。如果省略,则使用系统默认值。”。
当我使用
filedata = open(file.txt,"r",0)
或者
filedata = open(file.txt,"r",1)
或者
filedata = open(file.txt,"r",2)
或者
filedata = open(file.txt,"r",-1)
或者
filedata = open(file.txt,"r")
output 没有变化。 上面显示的每一行都以相同的速度打印。
output:
憨豆先生是一部英国电视连续剧,由 15 名 25-
分钟剧集由罗宾·德里斯科尔编剧,罗温·阿特金森主演
标题字符。 罗宾也写了不同的剧集
Driscoll 和 Richard Curtis,还有 Ben Elton 的。 十三的
剧集在 ITV 播出,从 1990 年 1 月 1 日试播,直到
1995 年 10 月 31 日的“晚安憨豆先生”。剪辑节目“The Best Bits of
憨豆先生”于1995年12月15日播出,其中有一集“Hair by
伦敦憨豆先生”直到 2006 年才在 Nickelodeon 上播出。
那么open()中的buffering参数function有什么用呢? 什么价值
哪个缓冲参数最好用?
启用缓冲意味着您不会直接与操作系统的文件表示或其文件系统 API 交互。 取而代之的是,从原始操作系统文件流中将一大块数据读取到缓冲区中,直到它被消耗为止,此时更多的数据被提取到缓冲区中。 就您获得的对象而言,您将获得一个包装底层RawIOBase
(代表原始文件流)的BufferedIOBase
对象。
这有什么好处? 与原始流的良好接口可能具有很高的延迟,因为操作系统必须在硬盘等物理对象上四处游荡,这可能并非在所有情况下都可以接受。 假设您想每 5 毫秒从一个文件中读取三个字母,并且您的文件位于一个老旧的硬盘上,甚至是网络文件系统上。 与其每 5ms 尝试从原始文件流中读取一次,不如将一堆字节从文件加载到内存中的缓冲区中,然后随意使用它。
您选择的缓冲区大小取决于您使用数据的方式。 对于上面的示例,1 个字符的缓冲区大小会很糟糕,3 个字符就可以了,任何不会对您的用户造成明显延迟的 3 个字符的大倍数都是理想的。
缓冲是将文件块存储在临时内存中直到文件完全加载的过程。 在python中可以给出不同的值。 如果缓冲设置为 0 ,则缓冲关闭。 当我们需要缓冲文件时,缓冲将设置为 1。
从实用的角度来看,也许重要的是缓冲参数确定您发送到 stream 的数据何时实际保存到磁盘。
当你打开一个没有缓冲参数的文件,并向它写入一些东西时,你会看到数据只在with open(...) as foo:
块退出后写入(或者当文件的close()
方法是调用),或者达到某些系统确定的默认缓冲区大小时。 但是如果你设置buffering
参数,它会在达到缓冲区大小后立即写入数据。
因此,使用 ie open('file.txt', 'w', buffering=1)
是一个有用的事情,当你有一个长时间运行的应用程序时,你正在向一个文件发送一些数据,并且你希望它保存在每一行之后,而不仅仅是在应用程序退出之后。 否则死机或停电等可能会导致数据丢失。
另请参阅: python 多久刷新一次文件?
缓冲设置为 -1 时,我的文件写入需要 13 分钟。 缓冲设置为 2**10 时,我的文件写入需要 7 秒。 所以,缓冲的目的是加速你的程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.