標準入出力

標準入出力とは

ここでの標準入出力とはUNIXの、より正確にいうとPOSIX.1-2017でstandard I/O streamsとして用意されている標準の入出力です。ここでの利用される想定としてはシェル上で直接入力する、パイプで入力を与える、あるいはリダイレクションにより入力させる、もしくは出力させることとします。現在はUNIX系オペレーティング・システムだけではなく、多くのオペレーティング・システムでもターミナル上で(Windows上ではコマンドプロンプトとして)用意しています。ここではUNIX系オペレーティング・システム(GNU/LinuxやmacOSなど)のシェル上で動作することを前提として説明します。

Pythonの標準入力

Pythonは基本的にオペレーティング・システムから独立したデザインになっておりUNIXをプラットフォームとする前提で作られてはいません。そのためビルトイン機能として用意されていません。そのためモジュールsysをインポートする必要があります。

標準入力から一度にすべて読み込む

今回のサンプルコードは標準入力から一度にすべて読み込む方法で取り入れ、その内容を標準出力に書き出します。stderrは標準エラー出力に出力します。

stdiosample.py

# File: stdiosample.py
#
# UNIX Standard I/O 
#
import sys
content=sys.stdin.read()        # 標準入力からすべてを読み込む。
sys.stdout.write(content)       # すべての内容を標準出力に書き出す。

# もしくは次の書き方ができます。
#
# from sys import stdin,stdout,stderr
# content=stdin.read()
# stdout.write(content)
# stderr.write(content)

sys.stdin.read()の行は、標準入力の入力が終了するまで処理が終了しません(「ブロックされる」と表現します)。sys.stdout.write()で標準出力に出力されます。

sys.stdinという形で使わず、stdinとして使いたい場合は、from sys import stdinという形をすることでsysを省略することが出来ます。ここではsysに含まれるstdin、stdout、stderrを使います。

行ごとに読み込む方法

むかしから入力から1行読み込んできて処理を行うことをループで実行するプログラムモデルがあります。Pythonのようにすべてを読み込んで来て、処理を行うというタイプのプログラミングスタイルが近年では多くなってきていますが、まだまだ、Input-Process-Outputのモデルを使いたいニーズは多くあります。

そのように処理をするときは次のように記述します。

iposample.py

# File: iposample.py
# Input-Process-Output model
#

from sys import stdin,stdout
for line in stdin:
    stdout.write(line)

トップページ