入力-処理-出力モデル、あるいは Input–Process–Output (IPO) Model とはソフトウェアでデータ処理を行う極めて単純なモデルであり、かつ、古くから使われています。
テキストを一行読み込み、読み込んだ内容を出力をするプログラムを書いてみます。ここではtext01.txtファイルを読み込み、先頭に行番号をつけて出力します。
# File: readline.py
#
# ファイル(自分自身)をwith文内でオープンし、1行つづ読み込み
# 先頭に行番号を加えて出力する (クローズは自動)
with open("text01.txt", encoding='utf-8') as f:
linecounter=1
for l in f:
print(linecounter,l,end='')
linecounter+=1
# openで明示的に文字コードを指定する場合はencodingの引数をつかいます。
# (Windows上では必要です)ここではwith as文を使っています。このプログラムを実行する同じディレクトリ(フォルダ)にあるファイルtext01.txtをオープンし、そのインスタンスを変数fとします。次に行カウンターとして使う変数 linecounter の初期化をしています。ファイルから1行取り出してきて、それを行カウンターと一緒に出力します。print()は何も指定しないと自動的に行末に改行コードをつけます。そのままだと、元々のファイルの行末の改行コードと二重に出力してしまうことになります。そこでprint()で行の最後に改行コードをつけない指定をします。最後に行カウンタに1を加えます。それをファイルにある行すべてに行います。
文字コードに関しては日本語環境のオペレーティング・システム上で使う限りは問題なく動くはずですが、もし、エンコーディングのエラーが発生する場合は明示的にutf-8を指定することも出来ます。
text01.txtの内容は青空文庫に収録されている太宰治のグッド・バイの冒頭部分です。テキストには漢字の読みがな(ルビ)が振ってあります。それを消すというプログラムを作ってみましょう。
文壇の、或《あ》る老大家が亡《な》くなって、その告別式の終り頃から、雨が降りはじめた。早春の雨である。
ここではフラグを使って制御する方法を用いることにしましょう。このプログラムはあまり処理効率がよくありませんが(推奨する書き方ではありませんが)、ここではフラグを使っての制御するプログラムのサンプルとして考えてください。
# File: skipruby.py
start_ruby='《' # ルビの開始
end_ruby='》' # ルビの終了
with open("text01.txt",encoding='utf-8') as f:
for l in f: # ファイルから1行取り出す
flag=False # フラグをオフにする
for c in l: # 行から1文字取り出す
if c == start_ruby: # ルビの開始の文字と一致するか
flag=True # フラグをオンにする
continue # その文字を飛ばして次の文字に進む
if c == end_ruby: # ルビの終了の文字と一致するか
flag=False # フラグをオフにする
continue # その文字を飛ばして次の文字に進む
if (flag != True ): # フラグがオンではない場合、1文字出力する
print(c,end='')このプログラムではflagが最初にデフォルトの値Falseとなる部分、どのタイミングでTrueやFalseになるのか、また、なぜcontinueが使われているかをよく観察してみてください。
階層化されたIPOモデルをシステム設計に使うという手法は1970年代初頭に既にIBMによりHIPO model (hierarchical input process output model)として取り入れられています。最初に誰がIPOモデルを提唱したのかですが、既に歴史に埋もれてしまい、私はみつけることができませんでした。