Python | ファイル操作など:open()

Python
スポンサーリンク

概要(open は「ファイルを開いて読み書きする入口」)

open() はファイルを開いて「ファイルオブジェクト」を返す組み込み関数です。読み込み、書き込み、追記、バイナリ操作までこれ一つで行えます。重要なのはモード(r, w, a, x, r+, b, t)とエンコーディング(encoding)を正しく選ぶこと、そして with 文で「自動で閉じる」習慣を持つことです。

# テキスト読み込み(UTF-8)
with open("notes.txt", "r", encoding="utf-8") as f:
    text = f.read()

# テキスト書き込み(上書き)
with open("out.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは\n")
Python

基本の使い方とモード(ここが重要)

読み込み(r)・書き込み(w)・追記(a)・新規作成(x)

  • r: 既存ファイルを読み込み。無ければエラー。
  • w: 新規作成または上書き。既存内容は消える。
  • a: 末尾に追記。既存内容は保持。
  • x: 新規作成のみ。既存ならエラー。
  • r+: 読み書き両用(位置管理に注意)。
# 追記
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("started\n")
Python

テキスト(t)とバイナリ(b)、エンコーディング

  • t(既定): 文字列で入出力。encoding が効く(例: “utf-8″)。
  • b: bytes で入出力。画像や圧縮ファイル、実行ファイルなどに使う。
# 画像コピー(バイナリ)
with open("in.png", "rb") as src, open("out.png", "wb") as dst:
    dst.write(src.read())
Python

with 文で必ず「閉じる」を自動化

ファイルは開いたら必ず閉じる必要があります。with 文ならエラーが起きても自動で close され、リソースリークを防げます。これは厳守の基本ルールです。

with open("data.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.rstrip())
Python

読み書きの具体テクニック(読み方・書き方・位置移動)

読み込みの3パターン(read, readline, 反復)

  • read(): 全部を文字列で取得(大きいファイルは注意)。
  • readline(): 1行だけ取得(末尾で空文字)。
  • for 行 in f: 行単位で効率的に反復。実務の定番。
# 行ごとの処理が安全で高速
with open("large.csv", "r", encoding="utf-8") as f:
    for line in f:
        cols = line.strip().split(",")
Python

書き込み(write, writelines)と改行の扱い

  • write(s): 文字列を書き込む。自動改行はしないので “\n” を明示。
  • writelines(list[str]): 複数行まとめ書き(改行は自分で付ける)。
rows = ["a,1", "b,2"]
with open("out.csv", "w", encoding="utf-8") as f:
    f.writelines(r + "\n" for r in rows)
Python

ファイル位置の移動(seek/tell)で部分読み書き

  • tell(): 現在位置(バイトオフセット)を返す。
  • seek(offset, whence): 位置を移動(0: 先頭基準、1: 現在基準、2: 末尾基準)。
with open("nums.txt", "r+", encoding="utf-8") as f:
    f.seek(0, 2)   # 末尾へ
    f.write("\n42")
Python

エンコーディング・改行・バッファ(重要ポイントの深掘り)

encoding を必ず明示(実務では UTF-8 が基本)

環境依存の既定エンコーディングは事故のもとです。テキストは原則 “utf-8” を明示。文字化けや例外(UnicodeDecodeError/EncodeError)を避けられます。

with open("jp.txt", "r", encoding="utf-8") as f:
    text = f.read()
Python

改行(newline)とプラットフォーム差

Windows は “\r\n”、UNIX は “\n”。テキストモードは通常「万能改行」扱いで自動変換します。均一化したいなら newline=”\n” を指定すると入出力を統一できます。

with open("log.txt", "w", encoding="utf-8", newline="\n") as f:
    f.write("ok\n")
Python

バッファと flush

書き込みはバッファに溜まってからディスクへ。すぐ保存したいときは f.flush()、または open(…, buffering=1) や print(…, flush=True) を使います。頻繁な flush は性能に影響するため必要時のみ。


エラー対策と安全設計(存在確認・例外・排他)

ファイルの存在・パスの安全な取り扱い

存在確認は pathlib.Path を使うと安全で直感的です。親ディレクトリの作成も簡単に行えます。

from pathlib import Path

p = Path("data/output.txt")
p.parent.mkdir(parents=True, exist_ok=True)
with p.open("w", encoding="utf-8") as f:
    f.write("ready")
Python

例外の扱い(FileNotFoundError, PermissionError など)

入出力は外部要因で失敗します。必要なら try/except を添えて、ユーザー向けに分かりやすいメッセージを返しましょう。

from pathlib import Path

def read_text_safe(path: str) -> str | None:
    try:
        return Path(path).read_text(encoding="utf-8")
    except FileNotFoundError:
        return None
Python

新規作成(x)で「誤上書き」を防ぐ

x モードなら既存ファイルを安全に守れます。ログ・レポート・成果物の重複生成対策に有効です。

try:
    with open("report.txt", "x", encoding="utf-8") as f:
        f.write("new report")
except FileExistsError:
    print("既に存在します")
Python

実践例(定番から一歩先まで)

例題1:設定ファイルの読み込み(行ごと)

def load_kv(path: str) -> dict[str, str]:
    kv = {}
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            k, v = line.split("=", 1)
            kv[k.strip()] = v.strip()
    return kv
Python

例題2:CSV を安全に書き出す(改行統一)

rows = [["name", "qty"], ["coffee", 2], ["tea", 1]]
with open("stock.csv", "w", encoding="utf-8", newline="\n") as f:
    for r in rows:
        f.write(",".join(map(str, r)) + "\n")
Python

例題3:巨大ファイルの部分読み( seek/tell )

def read_tail(path: str, last_bytes: int = 1024) -> bytes:
    with open(path, "rb") as f:
        f.seek(-last_bytes, 2)   # 末尾から
        return f.read()
Python

例題4:JSON 保存と読み込み(エンコーディング明示)

import json

data = {"items": ["coffee", "tea"], "qty": 3}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
Python

まとめ

open() は「ファイルを開く入口」で、モードとエンコーディングの選択、with 文による自動クローズが三大要点です。読み込みは行反復が基本、書き込みは改行を明示、位置移動(seek/tell)で部分処理も可能。改行のプラットフォーム差は newline でコントロールし、例外対策・存在確認は pathlib を併用して安全に。これらを押さえるだけで、初心者のファイル操作は一気に安定し、実務で通用する品質に届きます。

タイトルとURLをコピーしました