2016-01-30 57 views
5

我試圖從控制檯獲取由換行符分隔的多個名稱,並將它們放入一個變量。假設我想永遠從終端獲得輸入(我會稍後添加一些代碼以打破循環)。我知道如何做一個while循環和遞歸,但我希望能夠用for循環做到這一點。python遍歷stdin逐行使用輸入()

在下面的例子,當我得到"peter"作爲從終端我得到的每個字母,而不是一整行同時輸入:現在

for name in input(): 
    print(name) 

,如果我用sys.stdinname變量變爲"peter\n"

for name in sys.stdin: 
    print(name) 

有沒有一種簡單的方法來input()"name"一整行,而不是單個字符?或者只是使用for in的本質,我將迭代輸入中的字符?以這種方式獲得投入是否存在固有的風險/問題?在像這樣的情況下獲得輸入是否有「標準」方式?

我在Ubuntu 15.10上使用Python 3.5.1。

+0

'input()'返回一個字符串,它是一個可迭代的字符串,所以當你嘗試迭代它時,你會逐個獲取每個字符。 –

+0

好吧,這是有道理的。 input()返回一個字符串。那麼sys.stdin是否會返回一個逐行迭代的緩衝區? – PeterH

+0

因爲sys.stdin會返回一個類似於對象的文件,該文件在迭代時將包含輸入的每一行。 –

回答

5

你可以用stdin剝離的新行;如果你能去除所有尾隨空白(通常可以),那麼它只是:

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

您是在PY3,使作品原樣;如果你在Py2上,你需要添加一個導入,from future_builtins import map,所以你會得到一個懶惰的基於生成器的map(它會根據請求產生行,而不是sl 012 stdin直到它結束,然後返回list所有線條)。

如果您需要限制到換行符,發電機表達式可以做到這一點:

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

或進口允許map推動工作到C層爲(略)更快的代碼(共30個問題每行比genexpr快 - 一些納秒,但仍然每行比argumentless選項慢40納秒,在這個答案的頂部):

from operator import methodcaller 

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

如同第一個解決方案,對的Py2,一定要得到的mapfuture_builtins

0

我不建議你,但你可以創建一個生成器在for循環中使用的線通過輸入線迭代:

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

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

對不起,如果我不清楚。我試圖在終端中用一個換行符將每個名稱分隔多次。 – PeterH

+0

@PeterH我更新了我的答案 –