Pythonでテキストファイルやバイナリファイルを扱う場合、組み込み関数の open() を使用します。この関数は、ファイルを読み込むのか、書き込むのか、あるいは追記するのかといった「モード」を指定してファイルオブジェクトを作成します。
また、ファイル操作においては、処理が終わった後に必ずファイルを閉じる(リソースを解放する)必要があります。
この記事では、open() 関数の主要なモード一覧と、ファイルを安全かつ簡潔に扱うための with 文の使い方について解説します。
ファイルを開くモード一覧
open() 関数の第2引数には、ファイルをどのような状態で開くかを指定する「モード(mode)」を文字列で渡します。
デフォルトは 'rt'(テキストモードで読み込み)ですが、用途に応じて以下のような文字を組み合わせて指定します。
| 文字 | 意味 | 動作の詳細 |
r | 読み込み (Read) | 既存のファイルを読み込みます。ファイルが存在しない場合はエラー (FileNotFoundError) になります。デフォルトのモードです。 |
w | 書き込み (Write) | 新しくファイルを書き込みます。ファイルが既に存在する場合は、**中身が全て消去(上書き)**されます。存在しない場合は新規作成されます。 |
a | 追記 (Append) | ファイルの末尾にデータを追加します。ファイルが存在しない場合は新規作成されます。既存のデータは保持されます。 |
r+ | 読み書き | 読み込みと書き込みの両方を行います。ファイルが存在する必要があります。ファイルポインタは先頭に置かれます。 |
a+ | 読み書き (追記) | 読み込みと書き込みの両方を行います。ファイルが存在しない場合は新規作成されます。ファイルポインタは末尾に置かれます(追記用)。 |
b | バイナリモード | 画像や音声データなどを扱う際に使用します(例: rb, wb)。 |
t | テキストモード | 文字列データを扱う際に使用します。デフォルトのため通常は省略されます(例: rt は r と同じ)。 |
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"を明示的に指定することが推奨されます。
