プログラミングを学んでいると、「作成したデータを保存したい」「外部にあるテキストファイルを読み込んで処理したい」という場面に必ず突き当たります。設定ファイルの読み込みやユーザーデータの保存、ログの出力など、ファイルの読み書きはPythonでプログラムを作る上で欠かせない基本スキルです。
しかし、初心者の方にとっては「どうやってファイルを開くのか」「上書きと追記はどう違うのか」「ファイルを閉じる必要があるのか」など、迷うポイントも多いはずです。
そこで今回は、Pythonでファイルを読み書きするための基本的な方法から、安全にファイルを扱うための定石、そして目的に応じたモードの使い分けまでを詳しく解説します。
ファイル操作の基本:open関数とファイルオブジェクト
Pythonでファイルを操作するとき、中心となるのが `open()` 関数です。この関数を使うことで、ディスク上にあるファイルとプログラムを接続させることができます。
ファイルオブジェクトという考え方
`open()` 関数を呼び出すと、戻り値として「ファイルオブジェクト」というものが生成されます。これは、技術的に言えば「ディスク上の実際のファイルと対話するためのインターフェイス」のようなものです。
初心者の方にわかりやすく比喩で説明すると、ファイルオブジェクトは「操作対象のファイルのクローン」や「代理人」のような存在です。プログラムはこのクローンに対して「読み込んで」や「書き込んで」という命令を出します。すると、その処理が実体のファイルに反映されるという仕組みになっています。つまり、プログラムとファイルをつなぐ「ブリッジ」や「ゲートウェイ」の役割を果たしていると考えてください。
基本的な書き方
最もシンプルな書き方は以下の通りです。
“`python file = open("sample.txt", "r") # ここで読み書きの処理を行う file.close() “`
このように、`open()` でファイルを開き、最後に必ず `close()` メソッドでファイルを閉じる必要があります。
【重要】with構文を使った安全なファイル操作
先ほどの説明で「最後に必ずファイルを閉じなければならない」と述べました。しかし、人間が書くコードでは、処理の途中でエラーが発生して `close()` まで到達しなかったり、単純に書き忘れたりすることがよくあります。
ファイルを閉じるのを忘れると、メモリを無駄に消費したり、ファイルがロックされて他のプログラムから操作できなくなったりするリスクがあります。
そこで、Pythonでは `with` 構文を使うことが強く推奨されています。
with構文のメリット
`with` ブロックを使うと、インデントの中の処理が終了したタイミングで、Pythonが自動的にファイルを閉じてくれます。もし処理の途中で例外(エラー)が発生しても、確実にクローズされるため非常に安心です。
“`python with open("sample.txt", "r") as f: # ファイルに対する処理 data = f.read() # ここを抜けた時点で自動的にcloseされる “`
この `as f` の `f` はファイルオブジェクトを入れる変数名なので、他の名前に変えても問題ありません。現在のPython開発においては、この `with` 構文を使うのが標準的な作法となっています。
ファイルを「書き込む」方法とモードの使い分け
ファイルを書き込む際は、`open()` 関数の第2引数に「モード」を指定します。このモードによって、「新しく作るのか」「上書きするのか」「後ろに追記するのか」が決まります。
よく使う書き込みモード一覧
| モード | 意味 | 特徴 |
|---|---|---|
| `'w'` | 書き込み(Write) | ファイルが存在すれば中身を空にして上書きする。なければ新規作成する。 |
| `'a'` | 追記(Append) | ファイルの末尾に内容を追加する。なければ新規作成する。 |
| `'x'` | 排他作成(Exclusive creation) | 新規作成のみ。ファイルが既に存在している場合はエラー(FileExistsError)になる。 |
具体的な書き込み方
最も基本的な書き込みには `write()` メソッドを使います。
“`python with open("output.txt", "w") as f: f.write("こんにちは、Python!\n") f.write("ファイル書き込みのテストです。") “`
複数行を効率よく書き込む方法
リスト形式のデータを書き込みたい場合は `writelines()` メソッドが便利ですが、このメソッドは自動的に改行を加えてくれません。そのため、リストの要素ごとに改行を入れたい場合は、`join()` メソッドを使って改行コードで連結した文字列を作成し、`write()` で書き込む手法が有効です。
print関数を使った書き込み
意外かもしれませんが、`print()` 関数を使ってファイルに書き込むことも可能です。`print()` の引数に `file=f` と指定することで、画面ではなくファイルに内容を出力できます。`print()` が持つ様々な出力機能をそのまま利用できるため、柔軟な書き込みが可能です。
ファイルを「読み込む」方法と読み込み方の選択肢
読み込みモードは `'r'` (Read) です。`open()` 関数のデフォルト値が `'r'` になっているため、省略することも可能ですが、コードの分かりやすさのために記述しておくことが推奨されます。
ファイルの読み込み方には、データの量や目的に応じて3つの主要なメソッドがあります。
1. ファイル全体を一度に読み込む (`read`)
`read()` メソッドを使うと、ファイルの中身すべてを1つの大きな文字列として取得します。
“`python with open("sample.txt", "r") as f: content = f.read() print(content) “` 設定ファイルのような小さいファイルには最適ですが、数GBあるような巨大なログファイルをこの方法で読み込むと、メモリを大量に消費してコンピュータに負荷がかかるため注意が必要です。
2. 1行ずつ読み込む (`readline`)
`readline()` メソッドは、ファイルを1行だけ読み込みます。これをループなどで繰り返せば、メモリを節約しながら処理できます。
3. 行ごとのリストとして読み込む (`readlines`)
`readlines()` を使うと、ファイル内の各行を要素としたリストとして取得できます。
“`python with open("sample.txt", "r") as f: lines = f.readlines() for line in lines: print(line.strip()) # strip()で末尾の改行を除去 “`
応用編:さらに高度なファイル操作
基本をマスターしたら、より実践的なテクニックについて見ていきましょう。
読み書き両用モード (`+`)
モードに `'+'` を付加すると、読み込みと書き込みの両方が可能になります。
- `'w+'`: 書き込みと読み込み。既存の内容は削除される。
- `'a+'`: 追記と読み込み。ファイル末尾から操作が始まる。
- `'x+'`: 新規作成と読み込み。既にファイルがある場合はエラーになる。
読み書き両用モードを使う際は、`seek()` メソッドで「ファイルポインタ(今どこを読み書きしているかの印)」を移動させることが重要です。例えば、書き込んだ直後に内容を読み直したい場合は、`seek(0)` でポインタを先頭に戻す必要があります。
文字化けを防ぐ `encoding` 指定
日本語を含むファイルを扱う際、OSによって文字コードが異なるため「文字化け(UnicodeDecodeError)」が発生することがあります。これを防ぐには、`open()` 関数の `encoding` 引数に適切な文字コードを指定します。
“`python with open("sample.txt", "r", encoding="utf-8") as f: # 日本語ファイルを安全に読み込む “` 現代の標準である `utf-8` を指定しておくことで、多くの環境で安定して動作させることができます。
ファイルが存在しない場合のエラー対処
読み込みモード (`'r'`) で存在しないファイルを開こうとすると、`FileNotFoundError` という例外が発生します。実務では、`try-except` 構文を用いて、ファイルがない場合にどのような処理をさせるか(例:エラーメッセージを出す、空のファイルを作るなど)を設計することが重要です。
まとめ
Pythonでのファイル操作は、`with open(…) as f:` という構文さえマスターすれば、非常にシンプルかつ安全に行うことができます。
- 基本は `with` 構文を使うこと(閉じ忘れを防ぐため)。
- 目的に合わせてモードを選択すること(上書きなら `'w'`、追記なら `'a'`、新規作成のみなら `'x'`)。
- 読み込み方はデータ量で選ぶこと(全体なら `read()`、行ごとなら `readlines()` やループ処理)。
- 日本語を扱うなら `encoding="utf-8"` を忘れずに。
ファイル操作ができるようになると、プログラムで扱えるデータの範囲が劇的に広がります。まずは小さなテキストファイルの作成から始めて、徐々に複雑なデータの読み書きに挑戦してみてください。
ピックアップ記事



