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

sys.stdout.buffer.write(data)


然后,可以使用以下两种方法之一对其进行冲洗:

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


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


第一个调用对整个stdout对象(_io.TextIOWrapper)进行刷新
第二个调用仅在buffer子对象(_io.BufferedWriter)上刷新。


在什么情况下一个人会比另一个人偏爱?

最佳答案

从根本上说,TextIOWrapperBufferedWriter之间的区别是它们要处理的内容。看一下Python文档,您会发现BufferedWriter是为处理字节流而设计的:


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


虽然TextIOWrapper设计为处理特定于文本的字节流,但处理诸如编码和解码之类的事情。


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


至于你应该调用冲洗。因为TextIOWrapper实际上只是文本BufferedIOBase的一个很好的包装,所以这是一种洗礼。因此,如您所说,如果您实际上是在处理二进制数据而不是基于文本的数据,则可以只使用BufferedIOBase

10-03 00:31