whileループとファイル書き込みで、超シンプルなテキストエディタを作ってみる

プログラミングの基礎

こんにちは。IT/経済ジャーナリストで投資家の渡辺です。

これまでファイルを’r‘や’w‘で開き、シンプルに読み書きする方法について、学習しました。

<過去記事>

ファイルから1行読み込むお作法 〜ファイルを開き、readline()を使う
ファイルを読み書きする 〜Pythonでのファイルの読み書きはとてもシンプル

ただし、これだけだと、1行書いておしまい、そして1行読んで表示しておしまいで、ちょっと面白くありません。

次のステップとして、複数行の入力とファイルの書き込みを使って、長いテキストファイルを作ってみます。

 

終了の合図があるまで、入力→書き込みを繰り返す

動きのあるゲームなど、まさにそうですが、多くのアプリは終了の条件が出るまでループを繰り返す構造になっています。

こんな感じです。

メインの処理では、文字の入力とファイルへの書き出しをすることになります。

そして終了するかどうかですが、WindowsやMacのアプリであれば、ウィンドウの上隅の×印をクリックするか、「File」メニューから「終了」(Quit)を選ぶと終了します。

今回は、そこまで細かい処理はハードル高いので、入力する文字列が「///」(スラッシュ3回繰り返す)であれば、入力した内容を保存してプログラムを終了させることにします。

言い換えれば、入力内容をチェックし、///」であれば終了します。

まず書き込みモードでファイルを開く

最初の行は、すっかりおなじみですが、日本語が使えるように文字コードをUNICODE(UTF-8)に指定します。

# coding: utf-8

次に、input文でデータを書き出すファイル名を指定します。

出力するので、ファイル名は outfile という名前にします。

outfile = input(“ファイル名を指定してください:”)

先ほど指定したファイル名で、書き込み用ファイルを開きます。

w‘ が書き込みモードであるのは、覚えていますね。

myfile = open(outfile, ‘w’)

ここから先は、書き出しのファイルはmyfileという名前で操作できるようになりました。

 

入力内容が「///」になるまでwhileループを回す

ということで、入力内容をチェックし、///」でない間は、ずっとループし続けます。

入力内容はinbufという変数で受けることにしますが、while文でのループで内容をチェックするので、最初に「///」以外で何か文字を入れておきます。

とりあえず無難に半角スペースをあらかじめ入れておきます

ちなみに一時的に入力データを置いておく場所を「入力バッファ」と呼ぶので、inbufという変数名はよく使われます。

inbuf = ‘ ‘ #あらかじめ半角スペースを入れておく

変数inbufが「///」でない(not equal)という記号は、!= になります。

while inbuf != “///”:

これで、入力内容が「///」にならない限り、このループが回り続けることになります。

入力と書き込み

ここからはwhileループの中身になるので、半角4個分、字下げ(インデント)します。

字下げしているところは、whileループの中身と見なされます。

(字下げ)inbuf = input(“–> “)

入力した内容をそのまま現在開いているファイルに書き込みます。

書き込みには、ファイルmyfileに対してwrite()関数で行うのは、前回学習した通りです。

(字下げ)myfile.write(inbuf)

開いてあるファイルmyfileに、inbufの内容を書き込まれました。

これだけだと改行されないので、改行コード(\n)を追加する必要があります。

(字下げ)myfile.write(’\n”)

この ‘\’ という記号は、スラッシュの逆向きなのでバックスラッシュといいます。

バックスラッシュにアルファベットのnを組み合わせることで、改行という意味になります。

MacBookだとバックスラッシュは「Option」キーを押しながら「¥」キーを押します。

図で表すと、まずファイルができました。そこに文字列が書き込まれます。

書き込まれた文字列の最後に改行コードを入れているので、次のループで入力した文字列は次の行に書き込まれます。

それが積み重なっていくわけです。

先ほどのフローチャートをこの例に合わせて書き直すと、こんな感じになります。

入力内容が「///」であると、whileの条件が「」(false)になるので、whileの条件が成立しなくなります。

ということで、ループが終わって、次の処理に進みます

プログラムが終了するときは、close()関数でファイルを閉じるのを忘れないでください。

myfile.close()

最後に、これまで書いたコード全体をここに記します。

# coding: utf-8

outfile = input(“ファイル名を指定してください:”)

myfile = open(outfile, ‘w’)

inbuf = ‘ ‘ #あらかじめ半角スペースを入れておく

while inbuf != “///”:
    inbuf = input(“–> “)
    myfile.write(inbuf)
    myfile.write(‘\n’)

myfile.close()

 

動作確認してみよう

いつものように「Run ‘study00’」を実行して、このプログラムを実行してみてください。

またまた、test.txtというファイル名にして、5行ほど打ち込みました。

入力が終わったら、「///」を入力して終了することをプログラムに伝えます。

ファイル一覧の一番下にある「Scratches and Consoles」からtest.txtの内容を表示してみます。

入力した内容が反映されています。

また最終行が「///」になっています。

次回は、ファイルの読み込み機能を使って、このファイルの内容を表示してみます。

<今日の要約ノート>

open(ファイル名、’w’) モードでファイルを開く。終了を表す文字列が入力されるまではwhile文でループ(処理が延々と繰り返されること)するので、どんどん新しい行が追加されていく。while (入力内容)!= (終了を示す文字列)となっているが、「!=」は「==」の反対で「〜でない」、つまり否定を表す演算子であり、こういう処理ではよく使われる。

 

コメント

  1. […] […]

タイトルとURLをコピーしました