Python使用input()逐行迭代stdin

时间:2016-01-30 01:15:14

标签: python python-3.5

我试图从控制台获取由换行符分隔的多个名称并将它们放入变量中。让我们假设我想永远从终端获得输入(我将添加一些代码以便稍后退出循环)。我知道如何使用while循环和递归来完成它,但我希望能够使用for循环来完成它。

在下面的例子中,当我从终端获得"peter"作为输入时,我得到的每个字母而不是一行一行:

for name in input():
    print(name)

现在,如果我使用sys.stdin name变量变为"peter\n"

for name in sys.stdin:
    print(name)

是否有一种简单的方法可以让input()"name"提供整行而不是单个字符?或者仅仅通过使用for in的本质,我将迭代输入中的字符?以这种方式获取输入是否存在任何固有的风险/问题?是否有"标准"在这种情况下获取输入的方式?

我在Ubuntu 15.10上使用Python 3.5.1。

2 个答案:

答案 0 :(得分:7)

您可以将stdin换行以删除换行符;如果你可以删除所有尾随空格(通常没问题),那么它只是:

for name in map(str.rstrip, sys.stdin):
    ...

你在Py3上,所以它按原样运行;如果您使用的是Py2,则需要添加导入from future_builtins import map,这样您就会得到一个基于生成器的惰性map(因为它们会生成这些行)请求,而不是在stdin结束之前啜饮,然后返回所有行的list

如果您需要限制换行符,则生成器表达式可以执行此操作:

for name in (line.rstrip("\r\n") for line in sys.stdin):
    ...

或者使用导入允许map将工作推送到C层以获得(略微)更快的代码(每行30个纳秒的速度比genexpr快,但仍然每行40 ns比这个答案顶部的无争议选项):

from operator import methodcaller

for name in map(methodcaller('rstrip', '\r\n'), sys.stdin):
    ...

与第一个解决方案一样,在Py2上,请务必从map获取future_builtins

答案 1 :(得分:0)

我不建议你这样做,但你可以创建一个在for循环中使用的生成器来逐行迭代输入:

def getlines():
    while True:
        yield input()

for name in getlines():
    print(name)
    ## Remember to break out of the loop at some point