web-dev-qa-db-ja.com

sys.stdinは何を読みますか?

ファイルを開く方法を取得し、Pythonの組み込み関数を使用します。しかし、sys.stdinはどのように機能しますか?

for something in sys.stdin:
    some stuff here

lines = sys.stdin.readlines()

Sys.stdinでの上記の2つの異なる使用法の違いは何ですか?どこから情報を読んでいますか?キーボード経由ですか、それともファイルを提供する必要がありますか?

6
Vimzy

したがって、おそらく次のように、Pythonの「組み込み関数」を使用しました。

_file_object = open('filename')
for something in file_object:
    some stuff here
_

これは、ファイルオブジェクトでiteratorを呼び出すことでファイルを読み取ります。このオブジェクトは、ファイルから次の行を返します。

代わりに使用できます:

_file_object = open('filename')
lines = file_object.readlines()
_

現在のファイル位置から行をリストに読み込みます。

ここで、_sys.stdin_は単なるファイルオブジェクトであり、プログラムを開始する前にPythonによって開かれます。そのファイルオブジェクトで何をするかはあなた次第ですが、そうではありません本当に他のファイルオブジェクトとは異なります。openは必要ありません。

_for something in sys.stdin:
    some stuff here
_

ファイルの終わりに達するまで標準入力を繰り返します。これも同様です。

_lines = sys.stdin.readlines()
_

最初の質問は、ファイルオブジェクトのさまざまな使用方法に関するものです。

第二に、それはどこから読んでいますか?ファイル記述子0(ゼロ)から読み取っています。 Windowsでは、ファイルハンドル0(ゼロ)です。ファイル記述子/ハンドル0はデフォルトでコンソールまたはttyに接続されているため、実際にはキーボードから読み取られます。ただし、多くの場合、シェル(bashやcmd.exeなど)によって次のような構文を使用してリダイレクトにすることができます。

_myprog.py < input_file.txt 
_

これにより、ファイル記述子ゼロが変更され、キーボードではなくファイルが読み取られます。 UNIXまたはLinuxでは、基になる呼び出しdup2()を使用します。リダイレクトの詳細については、シェルのドキュメントを参照してください(勇気がある場合は、おそらく_man dup2_)。

11
cdarke

標準入力からの読み取りであり、キーボードからストリームデータの形式で提供される必要があります。

ファイルを提供する必要はありませんが、 redirection を使用してファイルを標準入力として使用できます。

Pythonでは、readlines()メソッドはストリーム全体を読み取り、それを改行文字で分割し、各行のリストを作成します。

_lines = sys.stdin.readlines()
_

上記は、行と呼ばれるリストを作成します。各要素は行になります(行末文字によって決定されます)。

これについては、Pythonチュートリアルの 入力および出力セクション で読むことができます。

ユーザーに入力を求める場合は、input()メソッドを使用します(in Python 2、use raw_input()) :

_user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
_
3
Burhan Khalid

Sys.stdinの動作を把握するには、次の手順を実行します。

シンプルなpythonスクリプトを作成し、「readStdin.py」という名前を付けましょう:

import sys
lines = sys.stdin.readlines()
print (lines)

次のいずれかのタイプのコンソールを開きます。

echo "line1 line2 line3" | python readStdin.py

スクリプト出力:

['"line1 line2 line3" \n']

そのため、スクリプトは「echo」によって生成された改行文字を含むリスト(「lines」という名前)への入力を読み取りました。あれは。

for something in sys.stdin:
    some stuff here

sys.stdinはファイルハンドル-stdinのファイルハンドルであるため、上記のコードは期待どおりに機能しません。 some stuff here行に到達しません

lines = sys.stdin.readlines()

上記のスクリプトをインタラクティブシェルで実行すると、ユーザーがCtrl-Dを押すまで実行がブロックされます。Ctrl-Dは入力の終了を示します。

2
Anthony Kong

私によると、sys.stdin.read()メソッドは、Enterキーのような特殊文字とその後にCtrl + Dが続くまで、ユーザーからの入力として行を受け入れ、入力を文字列として保存します。

Control + Dは停止信号として機能します。

例:

import sys

input = sys.stdin.read()
print(input)
tokens = input.split()
a = int(tokens[0])
b = int(tokens[1])
print(a + b)

プログラムを実行した後、スペースで区切られた2つの数字を入力し、Ctrl + Dを1回または2回押して終了すると、2つの入力の合計が表示されます。

1
Mr. Suryaa Jha