Pythonのファイル操作入門:open()関数のモード一覧とwith文による安全な読み書き

Pythonでテキストファイルやバイナリファイルを扱う場合、組み込み関数の open() を使用します。この関数は、ファイルを読み込むのか、書き込むのか、あるいは追記するのかといった「モード」を指定してファイルオブジェクトを作成します。

また、ファイル操作においては、処理が終わった後に必ずファイルを閉じる(リソースを解放する)必要があります。

この記事では、open() 関数の主要なモード一覧と、ファイルを安全かつ簡潔に扱うための with 文の使い方について解説します。

目次

ファイルを開くモード一覧

open() 関数の第2引数には、ファイルをどのような状態で開くかを指定する「モード(mode)」を文字列で渡します。

デフォルトは 'rt'(テキストモードで読み込み)ですが、用途に応じて以下のような文字を組み合わせて指定します。

文字意味動作の詳細
r読み込み (Read)既存のファイルを読み込みます。ファイルが存在しない場合はエラー (FileNotFoundError) になります。デフォルトのモードです。
w書き込み (Write)新しくファイルを書き込みます。ファイルが既に存在する場合は、**中身が全て消去(上書き)**されます。存在しない場合は新規作成されます。
a追記 (Append)ファイルの末尾にデータを追加します。ファイルが存在しない場合は新規作成されます。既存のデータは保持されます。
r+読み書き読み込みと書き込みの両方を行います。ファイルが存在する必要があります。ファイルポインタは先頭に置かれます。
a+読み書き (追記)読み込みと書き込みの両方を行います。ファイルが存在しない場合は新規作成されます。ファイルポインタは末尾に置かれます(追記用)。
bバイナリモード画像や音声データなどを扱う際に使用します(例: rb, wb)。
tテキストモード文字列データを扱う際に使用します。デフォルトのため通常は省略されます(例: rtr と同じ)。

with 文を使った安全なファイル操作

ファイルを開いた(open)後は、必ず閉じる(close)必要があります。しかし、処理の途中でエラーが発生した場合、close() が実行されず、ファイルが開かれたままになるリスクがあります。

Pythonでは、withを使用することで、ブロック内の処理が終了した時点(正常終了かエラー発生かにかかわらず)で、自動的にファイルを閉じることができます。

推奨される書き方は以下の通りです。

# ファイルへの書き込み(新規作成または上書き)
# 'w' モードを指定
file_path = "project_log.txt"

with open(file_path, "w", encoding="utf-8") as log_file:
    log_file.write("2025-12-01: プロジェクト開始\n")
    log_file.write("2025-12-02: 初期設定完了\n")

print(f"{file_path} に書き込みました。")

実行結果:

project_log.txt というファイルが作成され、2行のテキストが書き込まれます。with ブロックを抜けた時点で log_file.close() が自動的に行われています。

ファイルの読み込み

作成したファイルを読み込む例です。

# ファイルの読み込み
# 'r' モードを指定(省略可能)
with open(file_path, "r", encoding="utf-8") as file_handle:
    # read() ですべての内容を文字列として取得
    content = file_handle.read()

print("--- ファイルの内容 ---")
print(content)

実行結果:

--- ファイルの内容 ---
2025-12-01: プロジェクト開始
2025-12-02: 初期設定完了

エンコーディング(文字コード)の指定

テキストファイルを扱う際、OSのデフォルトエンコーディングに依存すると、Windows(cp932)とmacOS/Linux(utf-8)の間で文字化けが発生する原因となります。

そのため、open() 関数には encoding="utf-8" を明示的に指定することが強く推奨されます。

システムのデフォルトエンコーディングを確認する

現在の環境で encoding を省略した場合に何が使われるかは、標準ライブラリ locale で確認できます。

import locale

# システムの推奨エンコーディングを取得
default_encoding = locale.getpreferredencoding(False)

print(f"この環境のデフォルトエンコーディング: {default_encoding}")

実行結果(Windowsの例):

この環境のデフォルトエンコーディング: cp932

実行結果(macOS/Linuxの例):

この環境のデフォルトエンコーディング: UTF-8

この違いによるトラブルを避けるため、クロスプラットフォームなコードを書く際は常に encoding 引数を指定する習慣をつけることが重要です。

まとめ

  • ファイルを開くには open() 関数を使用します。
  • モード r (読込), w (上書き), a (追記) を適切に選択します。
  • with open(...) as f: 構文を使うことで、close() 忘れを防ぎ、安全にファイルを扱えます。
  • 文字化けを防ぐため、encoding="utf-8" を明示的に指定することが推奨されます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次