2017-12-18 21 views
-1

program1.py:stdinは文字列のように単語単位ではなく行単位で読み込まれるのはなぜですか?

a = "this is a test" 
for x in a: 
    print(x) 

program2.py:

a = """this is a test 
     with more than one line 
     three, to be exact""" 
for x in a: 
    print(x) 

program3.py:

import sys 

for x in sys.stdin: 
    print(x) 

infile.txt:これはテスト
ある

複数行
第二の例として、ちょうど同じ
とが、複数の単語

はなぜ個別の行に文字列の各文字は、プログラム1とPROGRAM2出力の両方を行うことが、私たちはcat infile.txt | python3 program3.pyを実行した場合、それを出力して行ごとのテキスト?

+2

sys.stdin'が文字列でない '理由 - それは行ずつを読み取るように構成された特殊なクラスです。 – furas

+1

'sys.stdin'は' str' *オブジェクトではなく、ファイルオブジェクトです。 –

答えて

1

説明:インタプリタの標準入力、出力およびエラーストリームに対応

ファイルオブジェクト。

したがってsys.stdinは文字列ではなくファイルオブジェクトです。 Fileオブジェクトの反復子がどのように機能するかを見る、もう一度、見て、pythonのdocsするには、次の

ファイルは通常、forループ(例えば、Fの行のために、イテレータとして使用されます。印刷line.strip())、next()メソッドが繰り返し呼び出されます。このメソッドは、次の入力行を返す、またはファイルが読み込みのために開いているときにEOFがヒットしたときに呼び出すとStopIterationを発生させます(ファイルが書き込み用に開いているときの動作は未定義である)

ので、反復子は、入力の次の行を生成します文字列ごとに繰り返される文字単位の繰り返しの代わりに、すべての呼び出しで使用されます。

-2

sys.stdinのデータは行の配列のように格納されていますので、for x in sys.stdinを実行すると、1行1行は文字ではありません。これを試してみてください:

for x in sys.stdin: 
    for y in x: 
     print(y) 
    print("") 
+2

'sys.stdin'は、データを行に分割して格納しません。これはストレージの詳細とは関係ありません。 – user2357112

+0

私はstdinが何であるかを知っていますが、stdinの仕組みを説明するために書いています... –

2

sys.stdinはファイルハンドルです。ファイルハンドルを反復すると、一度に1行ずつ出力されます。パイソンdocsからsys.stdin

+0

これは変更できます。 https://stackoverflow.com/questions/25611796/how-to-read-in-one-character-at-a-time-from-a-file-in-python – tripleee

関連する問題