第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.'
「さあな」アルが言った。「何を食うかな」
要求仕様の詳細
- 2つの入力ファイルをA,Bとする。ファイル名はinput()関数でユーザーから聞く
- 出力は画面(コードセルの出力アクション)とファイル「out.txt」の両方に対して行う
- 1段落とは改行コードで終わる1行の文字列である
- 出力するテキストは、以下の繰り返しである
- ファイルAの内容1行分
- ファイルBの内容1行分
- 空行を1行
- ファイルAおよびBのどちらかが先に終わり(EOF)に達した後は、もう一方が終わるまで空行と交互に出力する。つまりファイルA・Bの全行は残らず出力に含まれる。
たとえばファイルAの内容が、
ファイルBの内容が、a1 a2 a3 a4 a5 a6 a7
であるとき、出力は、b1 b2 b3 b4 b5
となるはずである。a1 b1 a2 b2 a3 b3 a4 b4 a5 b5 a6 a7
- 両ファイルとも終わったら、出力を終え、プログラムを終了する。
- ファイルAまたはBが存在しない(オープンできない)場合には、対応するエラー(例外)処理を行うこと。コードセルは何度でも実行できるので、エラーメッセージを表示して終了するだけでよいだろう。
作業手順とヒント
「急がば回れ」という通り、いきなりプログラムを書き始めるより、簡単なフローチャートを描き、ロジックに間違いがないか確かめてから、コーディング(プログラムを書くこと)に着手する方がよい。論理的に考える練習にもなるし、完成したフローチャートは将来の財産になる。フローチャートの箱の中身は日本語文でよい。
フローチャートの実例は、Webにたくさん落ちているので参考にするとよい※2。
このプログラムには、以下の要素が含まれるだろう。
- ユーザーの入力文字列からファイル名を得る
- ファイルを開く
- ループ処理
- マージされた1段落を出力する
- それぞれのファイルが終わりに達したかの判定
- ファイルを閉じる
- エラー処理
2 できる限り自分で考えてほしいが、参考のため実例を挙げる。