第7回 課題レポート1:テキスト処理ツール

前回までは、講義資料に掲載したサンプルプログラムを、入力しては実行する「写経」の繰り返しだった。新しい言語を学ぶのに必ず通る道とはいえ、そろそろ別の流儀にも挑戦しよう。「要求仕様」をもとに、それを満たすプログラムを自分で書くのだ。
今回はこれまでに学んだ構文を使って、つぎの要求仕様(外部仕様)を満たすプログラムを作る。完成したノートブック「merge.ipynb」をレポートの添付ファイルとして提出すること。

この回の内容

プログラムの要求仕様

ファイルマージツール「marge.ipynb」は、2つのテキストファイルの内容を段落ごとに付き合わせ、新たなテキストファイルとして出力するプログラムである。たとえば英語ファイルと、それを翻訳した日本語ファイルをマージすれば、以下のような対訳出力が得られる。英語の本を翻訳する時など、機械翻訳(MT)と組み合わせると作業がたいへんはかどる。または日英両方の文章がWebから無料で入手できる新聞社説※1などを対訳形式にすれば、語学の勉強にも役立つ。

1 たとえば「讀賣新聞」と「The Japan News」など。Webからデータを自動取得して対訳形式にするプログラムも、Pythonで比較的容易に書ける。この技術は、Webスクレイピングという。


THE KILLERS		Ernest Hemingway
殺し屋			アーネスト・ヘミングウェイ

The door of Henry's lunch-roon opened and two men came in. They sat down at the counter.
 ヘンリーズ・ランチルームのドアがあいて、二人の男が入ってきた。二人とも、カウンターの席に腰を下ろした。

  'What's yours?' George asked them.
「何にします?」ジョージが訊いた。

  'I don't know,' one of the men said. 'What do you want to eat, Al?'
「さあてと」一人が言った。「何を食いたい、アル?」

  'I don't know,' said Al. 'I don't know what I want to eat.'
「さあな」アルが言った。「何を食うかな」

要求仕様の詳細

  1. 2つの入力ファイルをA,Bとする。ファイル名はinput()関数でユーザーから聞く
  2. 出力は画面(コードセルの出力アクション)とファイル「out.txt」の両方に対して行う
  3. 1段落とは改行コードで終わる1行の文字列である
  4. 出力するテキストは、以下の繰り返しである
    • ファイルAの内容1行分
    • ファイルBの内容1行分
    • 空行を1行
  5. ファイルAおよびBのどちらかが先に終わり(EOF)に達した後は、もう一方が終わるまで空行と交互に出力する。つまりファイルA・Bの全行は残らず出力に含まれる。
    たとえばファイルAの内容が、
    
    a1
    a2
    a3
    a4
    a5
    a6
    a7
    
    ファイルBの内容が、
    
    b1
    b2
    b3
    b4
    b5
    
    であるとき、出力は、
    
    a1
    b1
    
    a2
    b2
    
    a3
    b3
    
    a4
    b4
    
    a5
    b5
    
    a6
    
    a7
    
    
    となるはずである。
  6. 両ファイルとも終わったら、出力を終え、プログラムを終了する。
  7. ファイルAまたはBが存在しない(オープンできない)場合には、対応するエラー(例外)処理を行うこと。コードセルは何度でも実行できるので、エラーメッセージを表示して終了するだけでよいだろう。

作業手順とヒント

「急がば回れ」という通り、いきなりプログラムを書き始めるより、簡単なフローチャートを描き、ロジックに間違いがないか確かめてから、コーディング(プログラムを書くこと)に着手する方がよい。論理的に考えるロジカル・シンキング練習にもなるし、完成したフローチャートは将来の財産になる。フローチャートの箱の中身は日本語文でよい。
フローチャートの実例は、Webにたくさん落ちているので参考にするとよい※2
このプログラムには、以下の要素が含まれるだろう。

初心者は、エラー処理(異常系)を含まないプログラム(正常系)をまず完成させてから、エラー処理を拡張するのが堅実な方法である。

2 できる限り自分で考えてほしいが、参考のため実例を挙げる。