sys.stdin.readlines()背后的内容

时间:2017-08-10 02:40:44

标签: python stdin

问题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就够了。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

幕后发生了什么?

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

当你只调用readline时,指针会一直显示,直到它到达\n个字符,然后返回它刚刚遍历的内容,并保持放置状态,等待你再次移动它。再次致电readline会导致指针移动到下一个\n,如果存在,则为EOF

readlines确实告诉指针从当前位置(不一定是文件的开头)一直遍历(\n在功能上毫无意义),直到它看到{ {1}}。

试一试!

尝试一下是最好的学习方法。

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