Pythonのopen()関数を徹底解説!ファイル操作の基本と安全な使い方


 

Pythonでプログラミングをしていると、テキストファイルやCSVファイルからデータを読み込んだり、結果をファイルに保存したりする場面は日常的に発生します。このようなファイルとのやり取りを行うための最も基本的な組み込み関数が**open()関数**です。この記事では、open()関数の基本的な使い方から、様々なファイルモード、そして安全かつ効率的なファイルのクローズ方法までを初心者にもわかりやすく解説します。

 

open()関数とは?Pythonにおけるファイル操作の入り口

 

Pythonのopen()関数は、ファイルを開いてファイルオブジェクト(file object)を生成するための組み込み関数です。このファイルオブジェクトを介して、ファイルの内容を読み込んだり、新しい内容を書き込んだりといった操作が可能になります。

 

基本的な使い方:ファイルパスとモードの指定

 

open()関数は、主に2つの必須引数を取ります。

  1. file (ファイルパス): 開きたいファイルのパス(ファイル名やディレクトリを含むフルパス)を文字列で指定します。

  2. mode (モード): ファイルをどのように開くか(読み込み専用、書き込み専用、追記など)を文字列で指定します。

Python
 
# ファイルを開く例 (読み込みモード)
file_object = open("my_file.txt", "r")
# ファイル操作(後述)
file_object.close() # ファイルを閉じる (重要!)

# ファイルを開く例 (書き込みモード)
file_object = open("new_file.txt", "w")
# ファイル操作
file_object.close()

 

ファイルモードの種類

 

mode引数には、以下の主要なモードを指定できます。

モード 説明 ファイルが存在しない場合 ファイルが存在する場合
'r' 読み込み (read) 専用。デフォルトのモード。 FileNotFoundError ファイルの先頭から読み込み
'w' 書き込み (write) 専用。既存の内容は上書きされる 新規作成 内容が削除され、上書き
'a' 追記 (append) 専用。ファイルの末尾に追記される。 新規作成 ファイルの末尾に追記
'x' 排他的作成 (exclusive creation)。新規作成専用。 新規作成 FileExistsError
'b' バイナリ (binary) モード。テキスト以外のファイル用。 (他のモードと組み合わせて) (他のモードと組み合わせて)
't' テキスト (text) モード。デフォルト。テキストファイル用。 (他のモードと組み合わせて) (他のモードと組み合わせて)
'+' 読み書きモード。読み込みと書き込みの両方を行う。 (他のモードと組み合わせて) (他のモードと組み合わせて)

'b''t'は、他のモードと組み合わせて使用します(例: 'rb'でバイナリ読み込み、'wt'でテキスト書き込み。't'はデフォルトなので通常は省略)。

 

例:各種モードの組み合わせ

 

Python
 
# バイナリ読み込みモード
# with open("image.png", "rb") as f:
#     image_data = f.read()

# 読み書きモード (ファイルが存在しない場合は作成され、存在する内容を読み書き可能)
# with open("log.txt", "r+") as f:
#     content = f.read()
#     f.write("\nNew entry.")

 

encoding引数:文字エンコーディングの指定(テキストモードのみ)

 

テキストモード ('t' またはモード指定なしのデフォルト) でファイルを開く場合、encoding引数で文字エンコーディングを指定することが非常に重要です。これを指定しないと、システムデフォルトのエンコーディングが使用され、環境によって異なる結果になったり、文字化けの原因になったりします。

Python
 
# UTF-8でファイルを書き込む
with open("japanese_text.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは、世界!\n")

# UTF-8でファイルを読み込む
with open("japanese_text.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

日本語のファイルを扱う場合、"utf-8" を指定するのが最も一般的で推奨されます。

 

ファイルの操作:読み込みと書き込み

 

open()でファイルオブジェクトを取得した後、様々なメソッドを使ってファイルの内容を操作します。

 

読み込み ('r'モード)

 

  • read(): ファイルの内容全体を文字列(またはバイナリモードならバイト列)として読み込みます。引数に整数を指定すると、そのバイト数/文字数だけ読み込みます。

  • readline(): ファイルから1行だけ読み込みます。

  • readlines(): ファイルのすべての行をリストとして読み込みます。

Python
 
# example.txt を作成(存在しない場合)
with open("example.txt", "w", encoding="utf-8") as f:
    f.write("これは1行目です。\n")
    f.write("これは2行目です。\n")
    f.write("これは3行目です。\n")

# ファイル全体を読み込む
with open("example.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print("--- read() ---")
    print(content)

# 1行ずつ読み込む
with open("example.txt", "r", encoding="utf-8") as f:
    print("--- readline() ---")
    line1 = f.readline()
    line2 = f.readline()
    print(line1.strip()) # strip()で改行を除去
    print(line2.strip())

# 全行をリストで読み込む
with open("example.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    print("--- readlines() ---")
    for line in lines:
        print(line.strip())

 

書き込み ('w', 'a', 'x'モード)

 

  • write(string): ファイルに文字列(またはバイト列)を書き込みます。改行は自動で追加されないため、必要なら\nを含める必要があります。

  • writelines(list_of_strings): 文字列のリストをファイルに書き込みます。リストの各要素は行として扱われますが、改行は自動で追加されないため注意が必要です。

Python
 
# 新規ファイルに書き込む (上書きされる)
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("新しいファイルに書き込みます。\n")
    f.write("次の行です。\n")

# ファイルに追記する
with open("output.txt", "a", encoding="utf-8") as f:
    f.write("これは追記された行です。\n")

# リストの行を書き込む
data_lines = ["アイテムA\n", "アイテムB\n", "アイテムC\n"]
with open("list_output.txt", "w", encoding="utf-8") as f:
    f.writelines(data_lines)

 

with open(...) as f:構文の重要性

 

ファイル操作で最も推奨される方法は、withステートメントを使用することです。

Python
 
with open("my_file.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)
# withブロックを抜けると、ファイルのクローズが自動的に行われる

このwith構文を使うと、以下のようなメリットがあります。

  • ファイルの自動クローズ: withブロックが終了する際に、たとえエラーが発生したとしても、Pythonが自動的にファイルをクローズしてくれます。これにより、ファイルが開きっぱなしになることによるリソースの無駄遣いやデータ破損のリスクを防ぐことができます。

  • コードの簡潔化: f.close()を明示的に書く必要がなくなります。

ファイル操作を行う際は、常にこのwith open(...) as ...:の構文を使用するように心がけましょう。

 

open()関数のその他の引数

 

  • buffering: バッファリングポリシーを指定します。通常はデフォルトで問題ありませんが、パフォーマンスチューニングが必要な場合に調整することがあります。

  • errors: エンコーディング/デコーディングエラーが発生した場合の処理方法を指定します(例: 'ignore', 'replace', 'strict')。

 

まとめ

 

Pythonのopen()関数は、ファイルとの間でデータをやり取りするための基本中の基本です。ファイルパスとモードを指定してファイルオブジェクトを取得し、そのオブジェクトのメソッドを使って読み書きを行います。特に重要なのは、リソースの解放を確実に行うために**with open(...) as ...:構文を常に使用することです。また、テキストファイルを扱う際は、encoding引数で文字エンコーディングを明示的に指定する**ことで、文字化けなどのトラブルを避けることができます。

  • open()関数はファイルを開き、ファイルオブジェクトを返します。

  • mode引数 ('r', 'w', 'a', 'b', '+'など) でファイルの開き方を指定します。

  • encoding引数で文字エンコーディングを明示的に指定し、文字化けを防ぎます。

  • ファイル操作後は必ずファイルをクローズする必要がありますが、with open(...) as f:構文を使えば自動で行ってくれるため、これが最も推奨される方法です。

  • ファイルオブジェクトには、read(), write(), readline()などのメソッドがあります。

このopen()関数を使いこなすことで、Pythonでのデータ処理の幅が大きく広がるでしょう。


 

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座