この記事では、Pythonでファイルを読み書きする方法を、具体的なコード例と合わせて解説します。
ファイルを開く・閉じる操作の基本
Pythonでファイルを開くには、open() 関数を使用します。open() 関数はファイルオブジェクトを返し、このオブジェクトを通じてファイル操作を行います。処理が完了したら close() メソッドでファイルを閉じます。
# ファイルを開く (読み込みモード) f = open("example.txt", "r") # ... ファイル操作 ... # ファイルを閉じる f.close()
ファイルを開くモードのオプション
open() 関数の第2引数 (モード) には、以下のいずれかを指定します。
| モード | 説明 |
|---|---|
r |
読み込み専用 (デフォルト)。ファイルが存在しない場合はエラー。 |
w |
書き込み専用。ファイルが存在する場合は上書き、存在しない場合は新規作成。 |
a |
追記。ファイルが存在する場合は末尾に追記、存在しない場合は新規作成。 |
x |
排他的作成。ファイルが存在する場合はエラー。 |
b |
バイナリモードで開く。 |
t |
テキストモードで開く (デフォルト)。 |
+ |
読み書き両用モード。r+, w+, a+ のように他のモードと組み合わせて使用する。w+ は既存の内容を削除することに注意。 |
ファイルの読み込み
ファイルの内容を読み込む主な方法は以下の3つです。
read()
ファイル全体を文字列として読み込みます。
f = open("example.txt", "r") content = f.read() f.close() print(content)
readline()
ファイルから1行ずつ読み込みます。
f = open("example.txt", "r") line = f.readline() while line: print(line, end="") # 各行の改行文字を保持 line = f.readline() f.close()
readlines()
ファイル全体を、各行を要素とするリストとして読み込みます。
f = open("example.txt", "r") lines = f.readlines() f.close() for line in lines: print(line, end="") # 各行の改行文字を保持
ファイルへの書き込み
ファイルへの書き込みには write() メソッドを使用します。
f = open("example.txt", "w") # 上書きモード f.write("Hello, world!\n") f.write("This is a new line.\n") f.close()
a (追記モード) を使うと、既存のファイル内容の末尾に新しい内容を追加できます。
f = open("example.txt", "a") # 追記モード f.write("This is appended text.\n") f.close()
with 文による自動クローズ
with 文を使うと、ファイル操作後に自動的にファイルが閉じられるため、close() の呼び出し忘れを防ぎ、コードも簡潔になります。with文を使った処理では、with ブロックを抜けると、自動的に f.close() が呼ばれるため安全です。
with open("example.txt", "r") as f: content = f.read() print(content)
補足: ファイルを close() し忘れるとどうなるか
ファイルの close()をし忘れると、以下のような問題が発生する可能性があります。
- リソースリーク: プログラムがファイルを開いたままにし、OSのファイルハンドルが解放されない。多数のファイルで発生するとシステムリソースを使い果たし、他のプログラムがファイルを開けなくなる。
- データの損失/破損 (特に書き込みモード):
close()が呼ばれるまでデータがバッファに残り、ファイルに書き込まれないことがある。プログラム異常終了時にバッファ内容が失われ、ファイルが不完全になる。 - 排他制御の問題: OSによってはファイルが開かれている間、他のプログラムが変更/削除できないようロックする。
close()を忘れるとロックが解除されず、他プロセスがアクセスできない。
with 文を使用すれば、これらの問題を確実に回避できますので、witn文を使ったファイルオープン、クローズが推奨されます。
サンプルコード: テキストファイルの内容を修正
既存のテキストファイル(original.txt) の各行の先頭に、行番号を追加した新しいファイル(numbered.txt)を作成します。
# 入力ファイルと出力ファイルを指定 input_file = "original.txt" output_file = "numbered.txt" # with文で両方のファイルを同時に開く with open(input_file, "r") as infile, open(output_file, "w") as outfile: for i, line in enumerate(infile): outfile.write(f"{i+1}: {line}") print(f"{input_file}に行番号をつけて{output_file}に保存しました。")
enumerate関数は、ファイルの各行を読み込みインデックスと行の内容をまとめて取得するために使用します。
f"{i+1}: {line}"はf-string(フォーマット文字列)です。変数iとlineに行番号と行の文字列が入り、指定のファイルに出力されます。
さらに高度なファイル操作
- バイナリファイルの読み書き: モードに
bを追加します (例:rb,wb)。画像や音声ファイルなどの処理に使用します。
バイナリファイルの画像をコピーする例
with open("image.jpg", "rb") as f_in, open("image_copy.jpg", "wb") as f_out:
data = f_in.read()
f_out.write(data)
print("画像をコピーしました")
- ファイル存在チェック:
os.path.exists()を使用します。
import os if os.path.exists("example.txt"): print("ファイルは存在します") else: print("ファイルは存在しません")
csvやjsonファイルの読み込み
CSVファイルやJSONファイルの読み書きを行う場合は、csvモジュールjsonモジュールを利用するとより簡単にファイルを扱えます。詳細は下記の記事で紹介しています。