【问题标题】:What's behind sys.stdin.readlines()sys.stdin.readlines() 背后是什么
【发布时间】:2017-08-10 02:40:44
【问题描述】:

问题 1: 我有一段这样的代码(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 就足够了。

【问题讨论】:

    标签: python stdin


    【解决方案1】:

    CTRL-D 在交互式 shell 中将EOF(文件结尾)控制字符发送到标准输入。通常,您通过重定向将文件提供给进程的标准输入(例如myprogram < myfile),但如果您以交互方式将字符输入到进程的标准输入中,您需要告诉它何时停止读取您正在使用的“文件”创造。

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

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

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

    幕后发生了什么?

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

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

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

    试试看!

    尝试是最好的学习方式。

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

    【讨论】:

    • 所以 readlines() 不是生成器? readlines() 是否可以像生成器一样工作?
    • 没有。 readlines 相当于说list(sys.stdin)。如果你这样做for line in sys.stdin,我相信sys.stdin 被视为生成器。在官方文档中搜索文件对象。
    猜你喜欢
    • 2016-07-15
    • 2012-05-15
    • 2010-09-15
    • 2023-03-21
    • 2011-06-20
    • 2013-01-02
    • 2012-04-17
    • 2012-11-30
    • 2011-04-02
    相关资源
    最近更新 更多