Python:sys.stdout.flush()与sys.stdout.buffer.flush()?

时间:2017-02-02 13:15:07

标签: python buffer stdout flush

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

sys.stdout.buffer.write(data)

然后要冲洗它,您可以使用以下两种方法之一:

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

在简单的情况下,这两个调用似乎都以相同的方式工作。 然而

  • 第一个在整个stdout对象上调用flush(_io.TextIOWrapper

  • 第二个仅在buffer子对象(_io.BufferedWriter)上调用flush。

在哪种情况下,人们更喜欢一个而不是另一个?

1 个答案:

答案 0 :(得分:1)

从根本上说,TextIOWrapperBufferedWriter之间的区别在于它们的设计目标。看一下Python文档,您会发现BufferedWriter旨在处理字节流:

  

BufferedIOBase处理原始字节流(RawIOBase)上的缓冲。它的子类BufferedWriterBufferedReaderBufferedRWPair缓冲流是可读写的,可读写的。

虽然TextIOWrapper旨在处理特定于文本的字节流,但处理编码和解码等事情。

  

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

至于你应该拨打哪一个。它是一种清洗,因为TextIOWrapper实际上只是文本BufferedIOBase的一个不错的包装器。因此,如果您正在处理二进制数据而不是基于文本的数据,那么您可以使用BufferedIOBase