Open4

書き込み歓迎! [標準入力/Python]input()とsys.stdin.readline()の違い調査メモ

Kumamoto-HamachiKumamoto-Hamachi

inputの基本

# main.py
if __name__ == "__main__":
    hoge = input("-->")
    print(hoge)

上記をterminal上で実行してやる

$ python main.py
-->fuga # 入力を促すプロンプトが出るので"fuga"と入力してみた
fuga

※参考
公式/input

Kumamoto-HamachiKumamoto-Hamachi

sys.stdin.readlineの基本

# main.py
if __name__ == "__main__":
    hoge = sys.stdin.readline().rstrip()
    print(hoge)
    fuga = sys.stdin.readline(2)
    print(fuga)
    piyo = sys.stdin.readline(2)
    print(piyo)

上記を実行。

$ python main.py
[kumamoto python_useful]$ python main.py
hoge
hoge
fuga
fu
ga

この結果、

  • 引数なしだとユーザー入力のエスケープ文字(改行)も読み取ってしまうこと(rstripを外せばわかる)
  • 数値を引数に入れると変数に受け取れる文字数が決まる。残りの受け取り役がいればそいつに渡してくれる

ということ

※参考
sys.stdin/公式

Kumamoto-HamachiKumamoto-Hamachi

inputとsys.stdin.readlineの違い

input sys.stdin.readline
inputはユーザーからの標準入力を受け取るがエスケープ文字は受け取らない readlineはエスケープ文字を含めてユーザーからの標準入力を受け取る
引数の値をプロンプトとして持つ readlineはsizeという引数を持つがそれが読み込むバイト数を決定する

※参考
Difference between input() and sys.stdin.readline()
※未読
Python 3: Why teach sys.stdin.readline() over input()?/GitHub

Kumamoto-HamachiKumamoto-Hamachi

調査中情報

※参考:angelさん情報

  • 標準入力
    「標準入力」は、入力データでも入力処理でもなくて「入力を司るオブジェクト ( の中で標準で用意済みのもの )」であり、sys .stdin そのもの。

  • readline
    ~.readline() は、単純にそのオブジェクトのメソッド ( 行読み込み処理 ) を呼んでいるだけ、ファイルを読み込む以下のコードと構図は同じです。

with open('hoge.txt','r') as file:
  line=file.readline()
  print(line,end=''
  • input()
    inputは、標準入力 sys .stdin を使って、対話的な入力処理を行うことを目的にした関数です。
    なのでプロンプト出力できたり、readlineライブラリによる機能強化ができるようになっています。
    なので、似たことができるにしても input() と sys .stdin .readline() は性格が大分違う処理です。
    https://docs.python.org/ja/3/library/sys.html#sys.stdin
    input()、多分とっつきやすいので多用されるのですが、リッチな分遅いので、競プロのような場面では本来不向きです