问题一: 我有一段这样的代码(Python2.7):
for line in sys.stdin.readlines():
print line
当我运行这段代码时,在终端中输入一个字符串并按下 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 中的标准输入。通常,您通过重定向(例如 myprogram < myfile
)将文件提供给进程的标准输入,但是如果您以交互方式将字符输入进程的标准输入,则需要告诉它何时停止读取您正在主动读取的"file"创造。
sys.stdin.readlines
等待 stdin 完成(通过 EOF
控制字符),然后在 EOF
之前方便地拆分整个 stdin 内容(刷新)到由换行符分隔的标记列表中。当您按下 ENTER 键时,您会发送一个 \n
字符,为您呈现为换行,但不会告诉 stdin 停止阅读。
关于其他两行,我认为这可能会有所帮助:
想想 sys.stdin
对象作为文件。当你EOF
,你保存那个文件,然后你就不能再编辑它了,因为它离开了你的手并且属于标准输入。您可以对该文件执行功能,例如 readlines
,这是表达“我想要一个列表,每个元素都是该文件中的一行”的一种方便方式。或者,您可以使用 readline
从中读取一行,在这种情况下,for 循环只会迭代该行中的字符。
幕后发生了什么?
在内部,对 sys.stdin
的引用阻止执行直到 EOF
收到 sys.stdin
.然后它变成一个存储在内存中的类文件对象,读取指针指向开头。
当您只调用 readline
时, 指针读取直到它到达 \n
角色,返回给你它刚走过的地方,并留在原地,等待你再次移动它。打电话readline
again 将导致指针移动直到下一个 \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/