如何读取stdin?一些代码高尔夫挑战需要使用stdin进行输入。


当前回答

我非常惊讶,到目前为止没有人提到过这个黑客:

python -c "import sys; set(map(sys.stdout.write,sys.stdin))"

在python2中,您可以放弃set()调用,但这两种方法都可以

其他回答

其他人提出的答案:

for line in sys.stdin:
  print line

是非常简单和Python化的,但必须注意的是,脚本将等待EOF,然后开始迭代输入行。

这意味着tail-f error_log | myscript.py不会按预期处理行。

这种用例的正确脚本是:

while 1:
    try:
        line = sys.stdin.readline()
    except KeyboardInterrupt:
        break

    if not line:
        break

    print line

更新从评论中可以看出,在python2上可能只涉及缓冲区,因此在发出打印调用之前,您最终会等待缓冲区填充或EOF。

有几种方法可以做到这一点。

sys.stdin是一个类似于文件的对象,如果您想读取所有内容,或者想读取所有信息并通过换行自动拆分,则可以调用read或readlines函数。(您需要导入sys才能正常工作。)如果要提示用户输入,可以在Python2.X中使用raw_input,而在Python3中只需输入。如果您实际上只想读取命令行选项,可以通过sys.argv列表访问它们。

您可能会发现这篇关于Python中I/O的Wikibook文章也是一个有用的参考。

我非常惊讶,到目前为止没有人提到过这个黑客:

python -c "import sys; set(map(sys.stdout.write,sys.stdin))"

在python2中,您可以放弃set()调用,但这两种方法都可以

以下代码片段将帮助您(它将把所有stdin块读取到EOF,并将其转换为一个字符串):

import sys
input_str = sys.stdin.read()
print input_str.split()

从Python 3.8开始,您可以使用赋值表达式:

while (line := input()):
    print(line)