问题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就够了。
答案 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个元素的列表:)