到達点は、データ形式と文字コードを明示して読み書きすることです。前提は第06回です。
データ形式には文法がある
JSONは辞書や配列などの構造、CSVは表形式のデータに使えます。CSVを単にカンマでsplitすると、引用符で囲んだカンマを壊します。自分で区切り規則を推測せず、形式に対応したライブラリを使います。
import csv
import io
import json
from pathlib import Path
from tempfile import TemporaryDirectory
from datetime import datetime, timezone
with TemporaryDirectory() as directory:
path = Path(directory) / "study.json"
data = {"language": "Python", "minutes": 25}
path.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8")
loaded = json.loads(path.read_text(encoding="utf-8"))
print(loaded["minutes"])
buffer = io.StringIO(newline="")
writer = csv.writer(buffer)
writer.writerow(["題名", "分"])
writer.writerow(["型, 関数", 30])
buffer.seek(0)
print(list(csv.reader(buffer))[1])
instant = datetime(2026, 1, 1, tzinfo=timezone.utc)
print(instant.isoformat())
main.pyの出力は25、二つの列からなる行、UTCの日時です。「型, 関数」は一つの項目のまま復元されます。実ファイルをcsvで開くときも newline="" と文字コードを指定します。
読めることと信用できることは違う
json.loadsで文法的に読めても、minutesが整数とは限りません。外部入力は構造、型、値の範囲を検証してから使います。pickleは任意のPythonオブジェクトを復元できる一方、読み込み時にコード実行へつながるため、信頼できないファイルの交換形式には使いません。
Pathで扱う相対パスは、原則現在の作業ディレクトリから解決されます。プログラムのファイルが置かれた場所と同じとは限りません。保存先は引数や設定で明示すると、意図しない場所への保存を避けられます。
日時ではタイムゾーンのない値と、タイムゾーンのある値を区別します。ログの発生時刻はUTCのaware datetimeで保存し、表示時に地域へ変換すると整理しやすくなります。誕生日のような日付だけの値にはdateを使います。
練習と解答
練習:JSONのminutesを文字列の「25」へ変更した場合、読み込みは成功するでしょうか。
解答:JSONとしては有効なので成功します。計算へ使う前に、文字列を認めて変換するのか、型違いとして拒否するのかを決めます。「データ形式のパース」と「業務上の検証」は別です。
公式資料
pathlib、json、csv、datetimeを参照できます。
Python全20回の目次 | 前の回 | 次の回