こんにちは。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 (入力内容)!= (終了を示す文字列)となっているが、「!=」は「==」の反対で「〜でない」、つまり否定を表す演算子であり、こういう処理ではよく使われる。
コメント
[…] […]