Python:sys.stdout.flush()和sys.stdout.buffer.flush()有什么区别?

3

假设您需要将二进制数据写入标准输出:

sys.stdout.buffer.write(data)

然后要清除缓存,您可以使用以下两种方法之一:

sys.stdout.flush()
sys.stdout.buffer.flush()

这两个调用在简单情况下似乎以相同的方式工作。然而,第一个调用会在整个stdout对象(_io.TextIOWrapper)上调用flush,而第二个调用只会在缓冲区子对象(_io.BufferedWriter)上调用flush。
有什么情况下我们会更喜欢其中一种方式?
1个回答

3
基本上,TextIOWrapperBufferedWriter 的区别在于它们处理的内容不同。通过查看 Python 文档,您将看到 BufferedWriter 设计用于处理字节流:

BufferedIOBase 处理原始字节流(RawIOBase)的缓冲。其子类 BufferedWriterBufferedReaderBufferedRWPair 缓冲了可读、可写和可读写的流。

TextIOWrapper 设计用于处理特定于文本的字节流,处理编码和解码等操作。

另一个 IOBase 子类 TextIOBase 处理字节表示文本的流,并处理从 unicode 字符串到字节的编码和解码。扩展它的 TextIOWrapper 是一个缓冲的文本接口,用于缓冲的原始流(BufferedIOBase)。

至于哪个需要调用flush函数,由于TextIOWrapper实际上只是文本BufferedIOBase的一个包装器,所以不管哪个都可以。所以如果您处理的是二进制数据而不是基于文本的数据,那么可以使用BufferedIOBase

你能提供一个例子,说明如何使用BufferedIOBase代替sys.stdout.buffer以获得更完整的答案吗?(例如:是否需要创建新对象,参数是什么等) - user7501761
1
我认为我已经相当合理地回答了你所问的问题。如果你想知道如何使用BufferedIOBase类,你可以随时查看这样的资源 - loganasherjones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接