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

标签 python stdin

问题一: 我有一段这样的代码(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/

相关文章:

python - 如何将 FuncAnimation(来自 matplotlib.animation 的动态绘图)配置为 numpy 数组?

mysql - 如何从 bash 提供 mysql 查询

python - 杀死除了启动kill命令的解释器之外的所有Python解释器

python - 将curl 转换为python 请求

python - 测试 numpy.dtype 的正确方法

io - 在 Rust 中是否有丢弃输入的标准方法?

无法让lldb通过重定向读取文件输入

c - 从 stdin 读取文本文件在最后一行停止

java - 创建一个字符串数组,其长度由用户输入确定

Python 请求 - SAML 登录重定向