python - sys.stdin.readlines() 背后是什么

原文 标签 python stdin

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

for line in sys.stdin.readlines():
    print line

当我运行此代码时,在终端中输入一个字符串并按 Enter 键,没有任何 react 。 “打印线”不起作用。
所以我想 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 < myfile ),但是如果您以交互方式将字符输入到进程的标准输入中,您需要告诉它何时停止读取您正在使用的"file"创造。
sys.stdin.readlines等待 stdin 完成(通过 EOF 控制字符),然后在 EOF 之前方便地拆分整个 stdin 内容(刷新)进入由换行符分隔的标记列表。当您按 ENTER 时,您会发送一个 \n字符,它作为新行呈现给您,但不会告诉 stdin 停止阅读。

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

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

幕后发生了什么?

在内部,引用 sys.stdin阻止执行直到 EOFsys.stdin 收到.然后它变成一个类似文件的对象存储在内存中,读取指针指向开头。

当您调用 readline 时,指针一直读取直到遇到 \n角色,返回给你它刚刚走过的东西,并保持原状,等待你再次移动它。调用 readline再次将导致指针移动到下一个 \n ,如果存在,否则 EOF .
readlines真正告诉指针从它的 一直遍历(\n 在功能上毫无意义)当前 位置(不一定是文件的开头)直到它看到 EOF .

试试看!

尝试是最好的学习方式。

要查看此行为的实际效果,请尝试创建一个包含 10 行的文件,然后将其重定向到打印 sys.stdin.readline 的 Python 脚本的标准输入中。 3 次,然后打印 sys.stdin.readlines .您会看到打印出 3 行,然后是一个包含 7 个元素的列表:)

关于python - sys.stdin.readlines() 背后是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45603581/

相关文章:

python - 如何在 Pandas 中为大量列重新格式化 value_counts() 分析

python - 如何在 Python 中使用 raw_input() 在某个字符后停止从用户读取输入?

input - Golang - 读取 Os.stdin 输入但不回显

c - 为什么在Raspberry-Pi Jessie Lite上启动时无法到达stdin?

python - 如何在XCode 4.6中配置Python?

python - __iter__如何工作?

c++ - 如何期望来自重定向和用户输入的输入

python - 如何使用 --passin 和 subprocess.Popen 自动化 Google App Engine upload_data?

python - 两个 boolean 值列表的二进制加法

python - 在 django 中使用 for 循环遍历另一个 url