Py初めてのPython

Day 5ファイル・API連携(外の世界とつながる)

ファイル読み書き(with open)とJSON/CSVの基本

テキスト・JSON・CSVを安全に読み書きし、withで閉じ忘れを防ぐ。

プログラムは「外の世界」とつながって初めて役に立つ

これまでのプログラムは、実行が終わると計算結果がすべて消えていました。変数はメモリ(コンピュータの一時的な作業場所)の上にあるだけなので、プログラムが終わると片付けられてしまうからです。結果を残したい、あるいは前回の続きから始めたい。そのためには、プログラムの外にあるファイルに書き出し、次回それを読み込む必要があります。ここが「外の世界とつながる」第一歩です。

ファイルとは、ディスク(電源を切っても消えない保存領域)に置かれた名前付きのデータのかたまりです。メモ帳で開けるテキストファイル、表計算で開けるCSV、システム間のデータ受け渡しに使うJSONなど、中身の形式はいろいろありますが、Pythonから見れば「開いて、読み書きして、閉じる」という手順は共通です。

with open で開くと、閉じ忘れがなくなる

ファイルは、使い終わったら必ず「閉じる」必要があります。閉じないと、書いた内容がディスクに反映されなかったり、他のプログラムがそのファイルを触れなくなったりします。Pythonでは with という仕組みを使うと、ブロックを抜けるときに自動でファイルを閉じてくれます。手動の close() を書き忘れる事故がなくなるので、実務ではほぼ常に with を使います。

PYTHON
# 書き込み: "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 で覚えると混乱しません。

PYTHON
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']
辞書をJSONで保存し、読み戻す

CSV: 表形式データの定番

CSV(カンマ区切り値)は、Excelなどで扱う表を、1行1レコード・列をカンマで区切って表したテキストです。標準の csv モジュールを使うと、区切りの処理を自分で書かずに読み書きできます。1行を辞書として扱える DictReader / DictWriter を使うと、列名でアクセスできて読みやすくなります。

PYTHON
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"])
CSVを辞書のリストとして読む

AIにはこう聞く

「このCSVを読み込んで、age列を数値に変換し、平均年齢を出すPythonコードを書いて。encodingはutf-8で」のように、入力形式・やりたい処理・条件を具体的に伝えると、そのまま使えるコードが返りやすくなります。返ってきたら open のモードと encoding が正しいかだけ自分で確認しましょう。

なぜ形式を使い分けるのか

自由なメモはテキスト、表はCSV、入れ子構造のあるデータ(オブジェクトの中にリスト、その中にオブジェクト…)はJSON、と向き不向きがあります。相手システムが期待する形式に合わせるのが基本です。形式を間違えると、読み込む側でエラーになったり、意味が壊れたりします。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

with open("data.txt", "w") as f: を実行したとき、data.txt に既にあった中身はどうなりますか。

Q2

Pythonの辞書を、ファイルにJSON形式で書き出すために使う関数はどれですか。

Q3

なぜファイル操作で close() を手書きするより with open(...) を使う方が良いのか、理由を説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。