在Python中,为什么从stdin读取一行会阻止从stdin.buffer读取

在Python中,为什么从stdin读取一行会阻止从stdin.buffer读取,python,Python,在Python中,为什么从stdin读取一行会阻止从stdin.buffer读取 片段: import sys a = sys.stdin.readline() b = sys.stdin.buffer.readline() print("A :: {}".format(a)) print("B :: {}".format(b)) 从中执行,缓冲区对象设计用于二进制数据,而不是文本: 注意要从标准流写入或读取二进制数据,请使用底层二进制缓冲区对象。例如,要将字节写入标准输出,请使用sys.

在Python中,为什么从stdin读取一行会阻止从stdin.buffer读取

片段:

import sys

a = sys.stdin.readline()
b = sys.stdin.buffer.readline()

print("A :: {}".format(a))
print("B :: {}".format(b))
从中执行
缓冲区
对象设计用于二进制数据,而不是文本:

注意要从标准流写入或读取二进制数据,请使用底层二进制缓冲区对象。例如,要将字节写入标准输出,请使用sys.stdout.buffer.write(b'abc')。 但是,如果您正在编写库(并且不控制其代码将在哪个上下文中执行),请注意,标准流可能会替换为不支持缓冲区属性的类似文件的对象,如io.StringIO


直接从stdin读取将消耗底层字节缓冲流。 它的消耗量是内部实现的一部分,不受用户控制——但是,从stdin读取文本内容至少会从缓冲区中消耗更多字节是合乎逻辑的(出于效率原因,可能会消耗更多字节)

很少有人会遇到这个问题,因为在同一个应用程序中尝试以两种方式读取stdin是没有意义的——要么与文本数据交互,要么与二进制数据交互。(在本例中,如果二进制数据中有一些文本,您所要做的就是手动处理它,并在Python代码上显式应用字符集解码和行尾转换)

换句话说:内部实现在为其翻译读取缓冲区之前先消耗缓冲区


正确的做法是:选择与缓冲区或文本层交互,并在应用程序的生命周期内仅与缓冲区或文本层交互。

感谢@Mikah链接,但帖子仍然没有回答这个问题。为什么stdin.readline()没有从stdin获取第二行。?您的问题是为什么读取一行会阻止从读取缓冲区中获取值。如果这不是你想要的,请编辑你的问题。它仍然是一样的。我想我不明白为什么stdin.buffer.readline()返回空字符串而不是
Line_2
A :: Line_1
B :: b''
Line_1
Line_2
Line_3
import sys

b = sys.stdin.buffer.readline()
a = sys.stdin.readline()

print("A :: {}".format(a))
print("B :: {}".format(b))
A :: Line_2
B :: Line_1