今回は、Pythonにおけるopen関数の各種モードの使い方についてご紹介します。
open関数のモードとは
Pythonのopen関数は、ファイルの読み書きを行う際に使用します。
ファイルを開くときには、モードを指定することで動作を変えることができます。
主なモードは以下のとおりです。
- r: 読み込み専用モード
- w: 書き込み専用モード
- a: 追記専用モード
- x: 排他的作成モード
- r+, w+, a+: 読み書き両用モード
- b: バイナリモード
- t: テキストモード
これらを適切に使い分けることで、さまざまなファイル操作を効率的に行えます。
基本的な使い方
読み込み専用 (r)
rモードは、既存のファイルを読み込み専用で開きます。
ファイルが存在しない場合はFileNotFoundErrorが発生します。
1 2 3 4 |
# sample.txt を読み込み専用で開き、内容を表示する例 with open('sample.txt', 'r', encoding='utf-8') as f: content = f.read() print(content) |
書き込み専用 (w)
wモードは、ファイルを書き込み専用で開きます。
既存のファイルがある場合は内容が切り詰められ、ファイルが存在しない場合は新規作成されます。
1 2 3 |
# 新規に output.txt を作成し、テキストを書き込み with open('output.txt', 'w', encoding='utf-8') as f: f.write('ここに新しい内容を書き込みます。') |
追記専用 (a)
aモードは、ファイルを追記専用で開きます。
既存のファイルがあれば末尾に追記し、ファイルが存在しなければ新規作成します。
1 2 3 |
# log.txt に追記 with open('log.txt', 'a', encoding='utf-8') as f: f.write('ログを追加します。\n') |
排他的作成 (x)
xモードは、新しいファイルのみを作成して開きます。
同名ファイルが存在する場合はFileExistsErrorが発生します。
1 2 3 4 5 6 |
# new_file.txt が存在しなければ作成、すでにあればエラー try: with open('new_file.txt', 'x', encoding='utf-8') as f: f.write('新規ファイルへ書き込みます。') except FileExistsError: print('ファイルが既に存在しています。') |
読み書き両用モード
ファイルを読み込みと書き込みの両方で扱いたい場合に使用します。
r+ モード
r+モードは、既存ファイルを読み書き両用に開きます。
ファイルが存在しない場合はエラーになります。
1 2 3 4 5 6 |
# 既存の data.txt を読み込んだ後、一部内容を書き換える例 with open('data.txt', 'r+', encoding='utf-8') as f: content = f.read() print('元の内容:', content) f.seek(0) f.write('上書き内容') |
w+ モード
w+モードは、ファイルを書き込み専用+読み込みで開きます。
既存ファイルがあれば中身が切り詰められ、ファイルがなければ新規作成されます。
1 2 3 4 5 6 |
# temp.txt を新規作成し、書き込み後に読み込みを実行 with open('temp.txt', 'w+', encoding='utf-8') as f: f.write('初期内容') f.seek(0) content = f.read() print('書き込み後の内容:', content) |
a+ モード
a+モードは、ファイルを追記専用+読み込みで開きます。
初期状態でファイルポインタが末尾にあるため、読み込みの際はseekで位置を調整する必要があります。
1 2 3 4 5 6 7 |
# diary.txt に追記した後、先頭に戻って全体を読み込む with open('diary.txt', 'a+', encoding='utf-8') as f: f.write('新しい日記エントリ\n') f.seek(0) content = f.read() print('現在の内容:') print(content) |
バイナリモードとテキストモード
t (テキストモード) は文字列としてファイルを扱い、b (バイナリモード) はバイト列としてファイルを扱います。
通常はテキストモードがデフォルトなので、エンコーディング指定が可能です。
バイナリモードの場合、画像や音声ファイルなどのバイナリデータをそのまま読み書きすることができます。
1 2 3 4 |
# 画像ファイルをバイナリモードで読み込む例 with open('image.png', 'rb') as f: data = f.read() print('画像データのバイト数:', len(data)) |
画像データのバイト数: 12345
よくあるエラーや注意点
ファイルの存在しない状態でrやr+を使うと、FileNotFoundErrorが発生します。
wやw+を使うと、既存ファイルの内容が上書きされるため、重要なデータが消えないように注意してください。
a+ではファイルポインタが末尾にあるため、読み込みを行う際はseek(0)で先頭に戻す必要があります。
日本語やマルチバイト文字を扱う場合は、encoding=’utf-8′などを指定しないと文字化けを起こすことがあります。
ファイル操作後は、with文を使用して自動的に閉じるか、close()メソッドを呼んでリソースを解放してください。
まとめ
open関数のモードを正しく使い分けることで、安全かつ効率的にファイル操作を行えます。
読み込み専用や追記、バイナリモードなど、それぞれの特徴を把握することが大切です。
ファイルポインタの位置やエンコーディングなども確認し、最適な方法でファイルを扱いましょう。