本文へスキップ
BecomeCoder

Pythonコース · 第7章 例外とファイル ― 実務で欠かせない備え · レッスン28

ファイル入出力 ― プログラムの外とやり取りする

ローカル実施

導入

ここまでのプログラムは、実行するたびにデータが消えていました。実務では、設定ファイルを読み込んだり、集計結果をファイルに保存したりと、プログラムの外にあるファイルとやり取りする場面が必ず出てきます。この学習環境(ブラウザ内の実行エンジン)は仮想的なサンドボックスのため実際のファイル操作はできませんが、実務の Python では以下のように書く、という「書き方」をここで押さえておきましょう。

説明

ファイルを開くには open() を使います。多くの場合、with 文と組み合わせます。

with open("data.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは\n")
    f.write("2行目です\n")

with open("data.txt", encoding="utf-8") as f:
    content = f.read()
    print(content)

with open(...) as f: と書くと、ブロックを抜けるとき(正常終了でもエラーでも)自動的にファイルが閉じられます。「開いたら閉じる」を手動で管理しなくてよいのが with の利点です(第8章で、この仕組み自体=コンテキストマネージャの作り方も学びます)。

モードの指定はよく使うものだけ覚えておけば十分です。

モード意味
"r"(省略時)読み込み専用
"w"書き込み専用(既存の内容は消える)
"a"追記(末尾に書き足す)

1行ずつ読みたいときは for でファイルをそのまま回せます。

with open("data.txt", encoding="utf-8") as f:
    for line in f:
        print(line.strip())   # strip() で改行文字を取り除く

CSV(カンマ区切りの表データ)は csv モジュールで扱います。

import csv

with open("members.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["name", "age"])
    writer.writerow(["太郎", 25])
    writer.writerow(["花子", 30])

with open("members.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)   # ['name', 'age'] のようにリストで1行ずつ取れる

JSON(設定ファイルやAPIのやり取りでよく使われるデータ形式)は json モジュールです。Python の辞書やリストとほぼそのまま対応します。

import json

data = {"name": "太郎", "age": 25, "hobbies": ["野球", "読書"]}

with open("profile.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False)

with open("profile.json", encoding="utf-8") as f:
    loaded = json.load(f)
    print(loaded["name"])   # 太郎

ファイルを介さず、文字列との変換だけしたいときは json.dumps()(辞書 → 文字列)・json.loads()(文字列 → 辞書)を使います。次の第8章では、この文字列変換の部分だけをブラウザ上で実際に動かして確かめます。

まとめ

  • open() はファイルを開く。with open(...) as f: と組み合わせると閉じ忘れがなくなる。
  • モードは "r"(読み込み)・"w"(書き込み・上書き)・"a"(追記)をまず覚える。
  • 表形式のデータは csv、構造化データは json モジュールが定番。
  • ファイル操作はエラーになりやすい(ファイルが無い、権限がない等)ので、前のレッスンで学んだ try / except と組み合わせて使うことが多い。