ファイルを読み書きする

INPUT · スライド

書いて、読み直す

01 / 07

プログラムの外を一往復させる

変数に入れた文字を、いったんファイルに出して、また変数に戻してみよう。

たったこれだけだけれど、プログラムの外を一往復したことになる。ふつうの変数は実行が終われば消えてしまうけれど、ファイルに出したものは残る。ここが決定的なちがいだよ。

memo = "ぎゅうにゅうをかう"with open("memo.txt", "w") as f:    f.write(memo)with open("memo.txt") as f:    modoshi = f.read()print(modoshi)

実行結果

ぎゅうにゅうをかう

02 / 07

戻ってくるのは必ず文字

数を書いても、読み戻したものは文字になっている。ファイルの中に入れられるのは文字だけだからだよ。

だから計算に使いたければ int() で戻す必要がある。第1章でやった型変換が、ここでちゃんと効いてくるんだ。

with open("kazu.txt", "w") as f:    f.write("300")with open("kazu.txt") as f:    moji = f.read()print(moji + "えん")print(int(moji) + 100)

実行結果

300えん
400

03 / 07

書くときと読むときで約束をそろえる

リストを残したいときは、1行に1つのように決めごとを作る。書くときは join でつなぎ、読むときは splitlines で分ける。

大事なのは、この2つが同じ決めごとを向いていること。書くほうだけカンマ区切りに変えたら、読むほうは壊れてしまうよ。

kudamonos = ["りんご", "みかん", "ぶどう"]with open("kudamono.txt", "w") as f:    f.write("\n".join(kudamonos))with open("kudamono.txt") as f:    modoshi = f.read().splitlines()print(modoshi)

実行結果

['りんご', 'みかん', 'ぶどう']

04 / 07

辞書は json で文字にする

辞書を write にそのまま渡すと TypeError になる。渡せるのは文字だけだったね。

そこで第6章の json の出番。json.dumps は辞書をそのまま文字に直してくれる。

日本語は既定だと \u308a のような記号に置きかえられてしまう。ensure_ascii=False を渡すと日本語のまま出るので、この先はこちらを使うよ。

import jsonzaiko = {"りんご": 3, "みかん": 5}print(json.dumps(zaiko))print(json.dumps(zaiko, ensure_ascii=False))

実行結果

{"\u308a\u3093\u3054": 3, "\u307f\u304b\u3093": 5}
{"りんご": 3, "みかん": 5}

05 / 07

辞書をそのまま保存して読み戻す

書くときに json.dumps で文字にして、読むときに json.loads で辞書に戻す。これで辞書が辞書のまま往復した。

読み戻したものは、ふつうの辞書とまったく同じように使える。キーで引けるし、for で回せる。

家計簿も、ゲームのセーブデータも、アプリの設定も、根っこはこの形で残しているんだよ。

import jsonzaiko = {"りんご": 3, "みかん": 5}with open("zaiko.json", "w") as f:    f.write(json.dumps(zaiko, ensure_ascii=False))with open("zaiko.json") as f:    modoshi = json.loads(f.read())print(modoshi)print(modoshi["りんご"])

実行結果

{'りんご': 3, 'みかん': 5}
3

06 / 07

まだ無いファイルに備える

保存したファイルがまだ無いことはよくある。いちばん最初に動かしたときだね。

無いファイルを読もうとすると FileNotFoundError で止まってしまう。そこで第4章の try / except の出番。無かったら初期値から始めると書いておけば、初回でも落ちないプログラムになるよ。

try:    with open("hozon-nasi.txt") as f:        nakami = f.read()except FileNotFoundError:    nakami = "はじめまして"print(nakami)

実行結果

はじめまして

07 / 07

この章でできるようになったこと

ファイルを開いて、読んで、書いて、読み戻す。ここまででプログラムの外にデータを残して、取り出すことができるようになった。

  • メモアプリ … 書いた文を残して、次に開いたときに出す
  • 家計簿 … 使った金額を積み上げて、合計を出す
  • ゲームのセーブデータ … 進み具合を残して、続きから始める

見た目はまったくちがうけれど、根っこはどれもこの往復だよ。

次の章では、for がリストにも文字列にもファイルにも同じように効いたのはなぜか、その正体を見にいくよ。