Pythonでファイルを操作するには、open()関数を使います。読み込み・書き込み・追記といった動作は「モード」と呼ばれる引数で切り替えることができ、ファイル操作の基本中の基本です。

この記事では、Pythonのファイル操作における open() 関数の基本的な使い方から、rwa などの各モードの違い、そして read() / readline() / readlines() / write() といったよく使うメソッドまで、サンプルコードを交えて丁寧に解説します。

「モードを間違えてファイルの内容を消してしまった」「どのメソッドを使えばいいか分からない」という方はぜひ参考にしてください。

open()関数を使ったファイル操作の基本

Pythonでファイルを扱うときは、まず open() 関数でファイルを開きます。基本的な構文は以下のとおりです。

fp = open("ファイル名", "モード")

第1引数にファイルのパス、第2引数に後述する「モード」を指定します。ファイルを開いたあとは、必ず close() でファイルを閉じる必要があります。

# 基本的な書き方(手動でcloseが必要)
fp = open("sample.txt", "r")
data = fp.read()
fp.close()  # 忘れるとリソースリークの原因になる

with文を使うのが推奨される理由

手動で close() を呼ぶのは、例外が発生したときに閉じ忘れるリスクがあります。そこで、with文(コンテキストマネージャ)を使う書き方が推奨されています。with ブロックを抜けると自動的に close() が呼ばれるため、安全にファイルを扱えます。

# 推奨される書き方:with文を使う
with open("sample.txt", "r") as fp:
    s = fp.read()
    print(s)  # ファイル全体の内容を出力
# withブロックを抜けると、自動でclose()される

以降のサンプルコードも、基本的にこの with 文を使った書き方で統一しています。

open()関数のモード一覧と違い(r・w・a など)

open() 関数の第2引数には「モード」を指定します。モードによって、読み込み・書き込み・追記などの動作が変わります。モードを間違えると、意図せずファイルの内容を消してしまうことがあるため、正しく使い分けることが重要です。

テキストモードの一覧

モード読み込み書き込み新規作成既存内容説明
"r"保持読み込み専用。ファイルがなければエラー
"r+"保持読み書き可能。ファイルが存在する必要あり
"w"削除書き込み専用。既存の内容はすべて上書き
"w+"削除読み書き可能。既存の内容は削除される
"a"保持追記専用。既存の内容は消えない
"a+"保持読み書き可能で追記。ポインタは常に末尾

バイナリモードの一覧

画像・PDF・音声ファイルなどのバイナリデータを扱う場合は、モードに b を追加します。

モード説明
"rb"バイナリファイルを読み込む
"wb"バイナリファイルを書き込む(既存内容は上書き)
"ab"バイナリファイルへ追記する

各モードの使い方サンプル

代表的な3つのモードについて、具体的な使い方を確認しておきましょう。

# 「r」モード:読み込み専用
with open("sample.txt", "r") as fp:
    content = fp.read()
    print(content)
# 「w」モード:書き込み(既存の内容は消えるので注意!)
with open("output.txt", "w") as fp:
    fp.write("Hello, Python!\n")
# 「a」モード:追記(既存の内容は残る)
with open("log.txt", "a") as fp:
    fp.write("ログを追記します\n")

ファイル操作でよく使うメソッド一覧

open() 関数でファイルを開いたあとは、ファイルオブジェクトに対してさまざまなメソッドを呼び出すことができます。ここでは、Pythonのファイル操作でよく使う主要メソッドを解説します。

1. read() ― ファイル全体を文字列として取得

read() はファイルの内容をすべて1つの文字列として読み込みます。改行文字(\n)もそのまま含まれます。

  • ファイルの内容を一括で取得したいときに使う
  • 大きなファイルを扱う場合はメモリを消費するので注意
  • 空文字列("")が返ったときはファイルの終端
with open("sample.txt", "r") as fp:
    content = fp.read()
    print(content)  # ファイルの全内容が出力される

2. readline() ― 1行だけ取得

readline() は1行ずつ読み込むメソッドです。2回呼び出すと次の行を読み込みます。

  • 1行ずつ処理したいときに使う
  • 取得した文字列には改行(\n)が含まれる
  • ファイルの終端に達すると空文字列("")を返す
with open("sample.txt", "r") as fp:
    line1 = fp.readline()
    print(line1)  # 最初の1行を出力

    line2 = fp.readline()
    print(line2)  # 次の1行を出力

3. readlines() ― 全行をリストで取得

readlines() はファイルの全行をリスト形式で返します。各行が文字列の要素として格納されます。

  • 全行をリストとして扱いたいときに便利
  • 各要素には改行(\n)が含まれる
  • インデックスで特定の行を取り出せる
with open("sample.txt", "r") as fp:
    lines = fp.readlines()
    print(lines)       # 例: ["1行目\n", "2行目\n", "3行目"]
    print(lines[0])    # 最初の行だけ取り出す

4. write() ― 文字列をファイルに書き込む

write() は引数に渡した文字列をファイルに書き込むメソッドです。"w" モードでは既存の内容が消えるため、追記したい場合は "a" モードと組み合わせて使います。

# wモードで書き込み(既存の内容は消える)
with open("output.txt", "w") as fp:
    fp.write("1行目のテキスト\n")
    fp.write("2行目のテキスト\n")

5. writelines() ― リストの内容をまとめて書き込む

writelines() はリストや反復可能なオブジェクトの内容をまとめて書き込みます。各要素に改行を自動で付けないため、必要に応じて \n を含める必要があります。

lines = ["りんご\n", "バナナ\n", "みかん\n"]
with open("fruits.txt", "w") as fp:
    fp.writelines(lines)

6. seek() / tell() ― ファイルポインタの操作

ファイルを途中から読み込んだり、現在の読み込み位置を調べたりするときに使います。

  • tell():現在のファイルポインタ位置(バイト数)を返す
  • seek(n):ファイルポインタを先頭から n バイトの位置に移動する
with open("sample.txt", "r") as fp:
    print(fp.tell())    # 0(先頭)
    fp.read(5)          # 5文字読み込む
    print(fp.tell())    # 5
    fp.seek(0)          # 先頭に戻す
    print(fp.read(5))   # もう一度先頭から5文字読み込む

for文でファイルを1行ずつ読み込む方法

大きなファイルを扱うときは、readlines() で全行をメモリに読み込むよりも、for文でファイルオブジェクトを直接イテレートする方が効率的です。

# for文で1行ずつ読み込む(メモリ効率が良い)
with open("sample.txt", "r") as fp:
    for line in fp:
        print(line.rstrip("\n"))  # 末尾の改行を除去して出力

この書き方は、数万行を超えるログファイルや大量のデータを扱う際に特に有効です。

文字コード(encoding)の指定方法

日本語を含むファイルを読み書きする際は、文字コードに注意が必要です。open() 関数の encoding 引数で文字コードを明示的に指定することで、文字化けを防ぐことができます。

# UTF-8で読み込む
with open("sample_utf8.txt", "r", encoding="utf-8") as fp:
    content = fp.read()
    print(content)

# Shift-JIS(cp932)で読み込む
with open("sample_sjis.txt", "r", encoding="cp932") as fp:
    content = fp.read()
    print(content)

Windowsで作成したファイルは cp932(Shift-JIS)、Linux/macOS やWeb系のファイルは utf-8 が一般的です。encoding を省略するとOSのデフォルト設定が使われるため、環境によって動作が異なる場合があります。明示的に指定する習慣をつけましょう。

よくあるエラーと対処法

FileNotFoundError:ファイルが見つからない

"r" モードで存在しないファイルを開こうとすると発生します。ファイルパスのスペルミスや、カレントディレクトリの確認をしましょう。

import os

# ファイルが存在するか確認してから開く
if os.path.exists("sample.txt"):
    with open("sample.txt", "r") as fp:
        print(fp.read())
else:
    print("ファイルが見つかりません")

UnicodeDecodeError:文字コードの不一致

ファイルの文字コードと指定した encoding が合っていないと発生します。前述の通り、encoding を明示的に指定することで解決できます。

まとめ:Pythonファイル操作のポイント

この記事では、Pythonのファイル操作における open() 関数の使い方と、よく使うメソッドについて解説しました。要点を整理すると次のとおりです。

  • ファイルを開くには open("ファイル名", "モード") を使う
  • with文を使うことで、自動的に close() が呼ばれて安全
  • モード "r" は読み込み、"w" は書き込み(上書き)、"a" は追記
  • "w" モードは既存の内容が消えるため、使用時は注意が必要
  • 読み込みメソッドは read() / readline() / readlines() を使い分ける
  • 日本語ファイルは encoding="utf-8" などを明示するのが安全
  • 大量データの読み込みは for 文のイテレートが効率的

モードやメソッドは種類が多く、最初から全部覚える必要はありません。必要なときにこの記事を参照しながら、少しずつ身につけていきましょう。

Pythonのファイル操作をさらに深く学びたい方は、Pythonのos.pathモジュールでファイル・ディレクトリを操作する方法PythonでCSVファイルを読み書きする方法(csvモジュール入門)の記事もあわせてご覧ください。

📚 関連記事