note.nkmk.me

Pythonのinput関数でキーボードからの入力を取得

Date: 2019-02-02 / tags: Python

ターミナルやコマンドプロンプト(cmd.exe)、PowerShellなどで実行したPythonプログラムの中でキーボードからの入力を受け付けて値を取得するには組み込み関数input()を使う。キーボードに限らずパイプなどから送られる標準入力を受け取る際にも使われる。

ここでは以下の内容について説明する。

  • Python2とPython3の違い: raw_input()input()
    • Python2のraw_input(), Python3のinput()
    • Python2のinput()
    • エラーが発生する場合
  • input()の基本的な使い方
  • int()float()で数値として取得
  • 複数の値を入力・取得
  • 改行を含む値を入力・取得
  • split()でリストlistとして取得

最初に説明するように、Python2系とPython3系でinput()の処理が異なる。以下のサンプルコードはすべてPython3。

python(またはpython3)コマンドによるスクリプトファイルの実行時に引数を渡す場合は以下の記事を参照。

また、ファイルの入出力については以下の記事を参照。

スポンサーリンク

Python2とPython3の違い: raw_input()とinput()

Python2にはraw_input()input()関数が存在し、Python2のraw_input()がPython3のinput()に相当する。

Python2のraw_input(), Python3のinput()

Python2のraw_input(), Python3のinput()はキーボードからの入力を文字列strとして取得する関数。

この記事のサンプルコードではPython3のinput()について説明する。

Python2のinput()

Python2のinput()は入力された文字列をeval()で式として評価する関数。eval(raw_input()) と同じ。

例えば、Python2のinput()1 + 2と入力すると、文字列'1 + 2'ではなく1 + 2を式として評価した結果である3として値が取得される。

Python3にはPython2のinput()のように式として評価する関数は存在しない。

エラーが発生する場合

input()関連でエラーが発生する場合、Python2とPython3が混同されていることが多い。

インストールされているPythonのバージョンではなく、エラーが発生するコード中でsys.versionなどを用いて実際にそのコードが実行されているバージョンを確認してみることを推奨する。

input()の基本的な使い方

以下のようにinput()で取得した値を変数に格納できる。

val = input()

この行が実行されると入力待ちの状態になり、ターミナルやコマンドプロンプト(cmd.exe)などでキーボードから値の入力が可能になる。例えばabcと入力した場合、文字列'abc'として値が取得できる。

val = input()
# abc

print(val)
# abc

print(type(val))
# <class 'str'>

input()の引数に文字列を指定すると入力待ち時にその文字列が表示される。省略するとなにも表示されず入力待ちなのか分からないので、入力を促すような文言を指定して表示させたほうが親切。

val = input('Enter your name: ')
# Enter your name: Alice

print(val)
# Alice

print(type(val))
# <class 'str'>

input()で取得できるのは常に文字列str。数値が入力されても整数intや浮動小数点数floatではなく文字列strなので注意。

val = input('Enter number: ')
# Enter number: 100

print(val)
# 100

print(type(val))
# <class 'str'>

整数intや浮動小数点数floatなどに変換したい場合はint(), float()を使う。後述。

なお、便宜上、ここまでのサンプルコードはprint()の出力をコメントで示している。実際にスクリプトファイルを実行したときのターミナルなどでの結果を示す。

スクリプトファイルの中身。

val = input('Enter your name: ')

print('You are', val)

それを実行した結果。Enter your name:のところで入力待ちになり、例ではAliceと入力している。

$ python3 input_usage_script.py
Enter your name: Alice
You are Alice

int()やfloat()で数値として取得

文字列strを整数intや浮動小数点数floatなどに変換したい場合はint(), float()を使う。

val = input('Enter number: ')
# Enter number: 100

print(val)
# 100

print(type(val))
# <class 'str'>

i = int(val)

print(i)
# 100

print(type(i))
# <class 'int'>

f = float(val)

print(f)
# 100.0

print(type(f))
# <class 'float'>

当然ながらint()float()で変換できない文字列に対してはエラーが発生する。

val = input('Enter number: ')
# Enter number: abc

print(val)
# abc

# i = int(val)
# ValueError: invalid literal for int() with base 10: 'abc'

ユーザーからの入力を制限することは出来ないので何らかの例外処理が必要。例えば変換できない入力は特定のデフォルト値とする場合は以下のようにする。

try:
    i = int(val)
except ValueError:
    i = 0

print(i)
# 0

複数の値を入力・取得

複数の値を取得したい場合は単純にinput()を繰り返せばよい。

val_1 = input('Enter 1st value: ')
val_2 = input('Enter 2nd value: ')
val_3 = input('Enter 3rd value: ')
# Enter 1st value: x
# Enter 2nd value: y
# Enter 3rd value: z

print(val_1)
# x

print(val_2)
# y

print(val_3)
# z

任意の個数の値を入力させたい場合、while文による無限ループを使う方法がある。

以下の例ではoverと入力されるまでinput()を繰り返し、入力された値をリストlistに追加している。

l = []

print('Enter "over" then finish')
while True:
    val = input('Enter value: ')
    if val == 'over':
        print('FINISH')
        break
    l.append(val)
# Enter "over" then finish
# Enter value: x
# Enter value: y
# Enter value: z
# Enter value: over
# FINISH

print(l)
# ['x', 'y', 'z']

組み込み関数iter()を使うとよりシンプルに書ける。上の例と同じくoverと入力されるまでinput()が繰り返される。

l = list(iter(input, 'over'))
# x
# y
# z
# over

print(l)
# ['x', 'y', 'z']

iter()は第一引数に指定した呼び出し可能オブジェクト(ここではinput)が第二引数(ここでは'over')を返すまで繰り返され、それまでの返り値を要素とするイテレータを生成する。それをlist()でリスト化している。

input()に引数を指定したい場合はラムダ式(無名関数)を使う。ラムダ式自体の引数はなし。

l = list(iter(lambda: input('Enter value: '), 'over'))
# Enter value: x
# Enter value: y
# Enter value: z
# Enter value: over

print(l)
# ['x', 'y', 'z']

数値のリストにしたい場合、input()のたびにint()float()を実行してもいいし、あとから文字列のリストを数値のリストに変換してもいい。

改行を含む値を入力・取得

input()での入力はEnterキーやReturnキーの改行で決定されるため、改行を含む値を一度に入力・取得できない。

上の例のようにwhile文やiter()を使ってリストとして取得してからjoin()で要素ごとに改行された文字列に変換することで、見かけ上、改行を含む値を入力し取得できる。

iter()を使う場合はlist()でリスト化せずにそのままjoin()の引数に指定できる。以下の例ではiter()の第二引数が空文字列''なので、EnterキーやReturnキーが2回連続して押された時点で入力が終了する。

s = '\n'.join(iter(input, ''))
# line1
# line2
# line3
# 

print(s)
# line1
# line2
# line3

print(type(s))
# <class 'str'>

コピペする場合

改行を含む文字列をコピペする場合、while文やiter()の例で入力・取得が可能だが、input()の引数に文字列を指定すると改行のぶんだけその文字列が表示されてしまうので注意。

また、入力の終了を判定する文字列として上の例のように特定の文字列(overなど)を指定すると、コピペする文字列の末尾に改行が含まれているかどうかでその文字列(over)を入力する前に改行が必要かどうかが異なってしまう。

空文字列''にしておくとコピペしたあとEnterキーやReturnキーを連打すればとりあえず入力が終了するようになるので分かりやすい。

split()でリストlistとして取得

複数の値を取得したい場合、上の例のようにwhile文を使わずに何らかの区切り文字を指定して入力させる方法もある。文字列strsplit()メソッドでリストlistに分割できる。

val = input('Enter values separated by comma: ')
# Enter values separated by comma: x,y,z

print(val)
# x,y,z

l = val.split(',')

print(l)
# ['x', 'y', 'z']

print(type(l))
# <class 'list'>

カンマの後に空白があったりすると追加の処理が必要なので注意。

標準入力を取得

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事