假设您需要将二进制数据写入标准输出:
sys.stdout.buffer.write(data)
然后,可以使用以下两种方法之一对其进行冲洗:
sys.stdout.flush()
sys.stdout.buffer.flush()
在一个简单的情况下,这两个调用似乎都以相同的方式工作。然而:
第一个调用对整个
stdout
对象(_io.TextIOWrapper
)进行刷新第二个调用仅在
buffer
子对象(_io.BufferedWriter
)上刷新。在什么情况下一个人会比另一个人偏爱?
最佳答案
从根本上说,TextIOWrapper
和BufferedWriter
之间的区别是它们要处理的内容。看一下Python文档,您会发现BufferedWriter
是为处理字节流而设计的:
BufferedIOBase处理原始字节流(RawIOBase)上的缓冲。它的子类BufferedWriter,BufferedReader和BufferedRWPair缓冲流,这些流是可读,可写的,并且可读可写。
虽然TextIOWrapper
设计为处理特定于文本的字节流,但处理诸如编码和解码之类的事情。
另一个IOBase子类TextIOBase处理其字节表示文本的流,并处理unicode字符串之间的编码和解码。 TextIOWrapper(对它进行扩展)是到缓冲原始流(BufferedIOBase)的缓冲文本接口。
至于你应该调用冲洗。因为TextIOWrapper
实际上只是文本BufferedIOBase
的一个很好的包装,所以这是一种洗礼。因此,如您所说,如果您实际上是在处理二进制数据而不是基于文本的数据,则可以只使用BufferedIOBase
。