Python 什么';s位于sys.stdin.readlines()后面

Python 什么';s位于sys.stdin.readlines()后面,python,stdin,Python,Stdin,问题1: 我有这样一段代码(Python2.7): 当我运行这个代码时,在终端中输入一个字符串,然后按Enter键,什么都不会发生“打印行”不起作用。 所以我想象sys.stdin.readlines()有缓冲区,但我想知道它是如何工作的?我是否可以刷新它,以便每次给出一行时,都可以立即执行“打印行” 问题2:这两条线有什么区别: for line in sys.stdin: for line in sys.stdin.readline(): 我发现他们的行为有点不同。如果我使用ctrl+D终

问题1: 我有这样一段代码(Python2.7):

当我运行这个代码时,在终端中输入一个字符串,然后按Enter键,什么都不会发生“打印行”不起作用。 所以我想象sys.stdin.readlines()有缓冲区,但我想知道它是如何工作的?我是否可以刷新它,以便每次给出一行时,都可以立即执行“打印行”

问题2:这两条线有什么区别:

for line in sys.stdin:
for line in sys.stdin.readline():

我发现他们的行为有点不同。如果我使用ctrl+D终止输入,在第一种情况下,我必须按ctrl+D两次,然后才能真正终止输入。而在第二种情况下,只有一个ctrl+D就足够了。

ctrl-D将
EOF
(文件结尾)控制字符发送到交互式shell中的stdin。通常,通过重定向(例如
myprogram
)将文件馈送到进程的stdin,但如果以交互方式在进程的stdin中键入字符,则需要告诉它何时停止读取正在创建的“文件”

sys.stdin.readlines
等待stdin完成(通过
EOF
控制字符),然后方便地将
EOF
之前的整个stdin内容(刷新)拆分为一个由换行符分隔的令牌列表。按ENTER键时,将发送一个
\n
字符,该字符将作为新行呈现给您,但不会告诉stdin停止读取

关于其他两行,我认为这可能会有所帮助:

sys.stdin
对象视为一个文件。当您
EOF
时,您保存了该文件,然后您就不能再编辑它了,因为它离开了您的手,属于stdin。您可以在该文件上执行函数,如
readlines
,这是表示“我想要一个列表,每个元素都是该文件中的一行”的方便方式。或者,您可以使用
readline
从中读取一行,在这种情况下,for循环将仅迭代该行中的字符

幕后发生了什么? 在内部,对
sys.stdin
的引用会阻止执行,直到在
sys.stdin
中接收到
EOF
。然后它变成一个类似文件的对象,存储在内存中,读取指针指向开始

当您仅调用
readline
时,指针将一直读取,直到它碰到
\n
字符,返回到刚才遍历的内容,并保持不变,等待您再次移动它。再次调用
readline
将导致指针移动到下一个
\n
,如果它存在,否则
EOF

readlines
实际上是告诉指针从其当前位置(不一定是文件的开头)一直遍历(
\n
在功能上没有意义),直到它看到
EOF

试试看! 尝试是最好的学习方式


要查看此行为,请尝试创建一个包含10行的文件,然后将其重定向到python脚本的stdin,该脚本将打印
sys.stdin.readline
3次,然后打印
sys.stdin.readlines
。您将看到打印出3行,然后是一个包含7个元素的列表:)

那么readlines()不是生成器吗?readlines()有可能像生成器一样工作吗?没有。readlines相当于说
list(sys.stdin)
。如果您对sys.stdin中的行执行
sys.stdin
将被视为生成器,我相信。在官方文档中搜索文件对象。
for line in sys.stdin:
for line in sys.stdin.readline():