为什么从标准输入读取行会阻止从Python中的标准输入读取

片段:

import sys

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

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


使用<运算符执行以提供一个文件作为stdin。
python script.py < text.txt

输出:

A :: Line_1
B :: b''


文件:

Line_1
Line_2
Line_3


为什么B不打印Line_2?


更新:

具有相同配置但顺序有所变化的代码段

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

最佳答案

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

很少有人会遇到此问题,因为尝试在同一应用程序中以两种方式尝试从stdin读取几乎没有意义-您将与文本数据进行交互,或者与那里的二进制数据进行交互。 (在这种情况下,如果二进制数据中有一些文本,则您要做的就是手动处理它,并在Python代码上显式应用字符集解码和行尾翻译)。

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

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

10-07 19:11
查看更多