2016-01-30 5 views
5

私はコンソールから改行で区切られた複数の名前を取得し、変数に入れようとしています。ターミナルからの入力を永久に取得したいとしましょう(後でループから抜け出すためのコードをいくつか追加します)。私はwhileループとrecursionでそれを行う方法を知っていますが、私はforループを使ってそれをやってみたいです。私は一度に行全体ではなく、各文字を取得し、端末からの入力として"peter"を取得する以下の例でPythonは、input()を使って行ごとにstdinを繰り返し処理します。

:私が使用している場合、

for name in input(): 
    print(name) 

sys.stdinname変数"peter\n"なる:

for name in sys.stdin: 
    print(name) 

"name"行全体ではなく、個々の文字を与えることinput()を取得する簡単な方法はありますか?または単に使用の性質によってfor in私は入力の文字を反復処理するつもりですか?このような方法で入力を得ることに固有のリスク/問題はありますか?このような状況で入力を得るための「標準的な」方法はありますか?

私はUbuntu 15.10でPython 3.5.1を使用しています。

+0

'input()'は反復可能な文字列を返します。そのため、繰り返し実行しようとすると各文字が1つずつ取得されます。 –

+0

それは意味があります。 input()は文字列を返します。したがって、sys.stdinは1行ずつ反復されるバッファを返しますか? – PeterH

+0

sys.stdinはオブジェクトのようなファイルを返します。これは、反復処理されると、入力の各行が含まれます。 –

答えて

5

あなたは改行を取り除くために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ナノ秒):最初の解決策のよう

from operator import methodcaller 

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

、PY2に、mapを取得することを確認してくださいfuture_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私の回答を更新しました –

関連する問題