Day 5・ファイル・API連携(外の世界とつながる)
ファイル読み書き(with open)とJSON/CSVの基本
テキスト・JSON・CSVを安全に読み書きし、withで閉じ忘れを防ぐ。
プログラムは「外の世界」とつながって初めて役に立つ
これまでのプログラムは、実行が終わると計算結果がすべて消えていました。変数はメモリ(コンピュータの一時的な作業場所)の上にあるだけなので、プログラムが終わると片付けられてしまうからです。結果を残したい、あるいは前回の続きから始めたい。そのためには、プログラムの外にあるファイルに書き出し、次回それを読み込む必要があります。ここが「外の世界とつながる」第一歩です。
ファイルとは、ディスク(電源を切っても消えない保存領域)に置かれた名前付きのデータのかたまりです。メモ帳で開けるテキストファイル、表計算で開けるCSV、システム間のデータ受け渡しに使うJSONなど、中身の形式はいろいろありますが、Pythonから見れば「開いて、読み書きして、閉じる」という手順は共通です。
with open で開くと、閉じ忘れがなくなる
ファイルは、使い終わったら必ず「閉じる」必要があります。閉じないと、書いた内容がディスクに反映されなかったり、他のプログラムがそのファイルを触れなくなったりします。Pythonでは with という仕組みを使うと、ブロックを抜けるときに自動でファイルを閉じてくれます。手動の close() を書き忘れる事故がなくなるので、実務ではほぼ常に with を使います。
# 書き込み: "w" は write(上書き)モード
# encoding="utf-8" は日本語を文字化けさせないためのおまじない
with open("memo.txt", "w", encoding="utf-8") as f:
f.write("1行目です\n")
f.write("2行目です\n")
# ここで with のブロックを抜けると、f は自動的に閉じられる
# 読み込み: "r" は read モード
with open("memo.txt", "r", encoding="utf-8") as f:
text = f.read() # ファイル全体を1つの文字列として読む
print(text)"w" は既存の中身を消す
モード "w" で開くと、そのファイルの中身は最初にまるごと消えます。追記したいときは "a"(append=末尾に追加)を使います。大事なファイルをうっかり "w" で開いて空にしてしまう事故はよくあるので、モード文字は毎回意識してください。
JSON: プログラム同士のデータのやりとりに使う形式
JSON(ジェイソン)は、辞書やリストのようなデータを文字列にして保存・送信するための形式です。Web APIの多くはJSONでデータを返します。Pythonでは標準の json モジュールで、Pythonの辞書と JSON文字列を相互に変換できます。dump/load はファイル相手、dumps/loads は文字列相手、と末尾の s で覚えると混乱しません。
import json
data = {"name": "田中", "age": 28, "skills": ["Python", "SQL"]}
# 辞書 -> JSONファイルに書き出す
# ensure_ascii=False で日本語をそのまま(\uXXXX に変換せず)保存
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# JSONファイル -> 辞書に読み戻す
with open("user.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"]) # 田中
print(loaded["skills"]) # ['Python', 'SQL']CSV: 表形式データの定番
CSV(カンマ区切り値)は、Excelなどで扱う表を、1行1レコード・列をカンマで区切って表したテキストです。標準の csv モジュールを使うと、区切りの処理を自分で書かずに読み書きできます。1行を辞書として扱える DictReader / DictWriter を使うと、列名でアクセスできて読みやすくなります。
import csv
# users.csv の中身(例):
# name,age
# 田中,28
# 佐藤,34
with open("users.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f) # 1行目を見出しとして扱う
for row in reader:
# row は {"name": "田中", "age": "28"} のような辞書
print(row["name"], row["age"])AIにはこう聞く
「このCSVを読み込んで、age列を数値に変換し、平均年齢を出すPythonコードを書いて。encodingはutf-8で」のように、入力形式・やりたい処理・条件を具体的に伝えると、そのまま使えるコードが返りやすくなります。返ってきたら open のモードと encoding が正しいかだけ自分で確認しましょう。
なぜ形式を使い分けるのか
自由なメモはテキスト、表はCSV、入れ子構造のあるデータ(オブジェクトの中にリスト、その中にオブジェクト…)はJSON、と向き不向きがあります。相手システムが期待する形式に合わせるのが基本です。形式を間違えると、読み込む側でエラーになったり、意味が壊れたりします。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
with open("data.txt", "w") as f: を実行したとき、data.txt に既にあった中身はどうなりますか。
Pythonの辞書を、ファイルにJSON形式で書き出すために使う関数はどれですか。
なぜファイル操作で close() を手書きするより with open(...) を使う方が良いのか、理由を説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。