Python使用input()逐行迭代stdin

Pet*_*erH 10 python python-3.5

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

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

for name in input():
    print(name)
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用sys.stdinname变量变成"peter\n":

for name in sys.stdin:
    print(name)
Run Code Online (Sandbox Code Playgroud)

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

我在Ubuntu 15.10上使用Python 3.5.1.

Sha*_*ger 10

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

for name in map(str.rstrip, sys.stdin):
    ...
Run Code Online (Sandbox Code Playgroud)

你在Py3上,所以它按原样运行; 如果你在Py2上,你需要添加一个导入,from future_builtins import map所以你得到一个懒惰的,基于生成器的map(根据请求生成行,而不是stdin在它结束之前啜饮,然后返回list所有行中的一行) ).

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

for name in (line.rstrip("\r\n") for line in sys.stdin):
    ...
Run Code Online (Sandbox Code Playgroud)

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

from operator import methodcaller

for name in map(methodcaller('rstrip', '\r\n'), sys.stdin):
    ...
Run Code Online (Sandbox Code Playgroud)

像第一个解决方案,对的Py2,确保获得mapfuture_builtins.