【Python open】ファイル操作の基本から活用方法までわかりやすく解説

はじめに

Pythonでファイルを扱うときに活用できる関数として、open があります。
この関数を使うと、テキストファイルやバイナリファイルの読み書きが簡単にできます。
システム開発やデータ分析など、さまざまな分野でファイル操作は必要になります。
そのため、どのようにファイルを安全に読み書きし、正しくクローズするかを理解しておくことが大切ではないでしょうか。

ファイル操作というと、最初は難しく感じるかもしれません。
ですが、Pythonでのファイル操作はシンプルな文法で書きやすいです。
ファイルを扱う際のモード指定やエンコーディング、例外処理といったポイントさえ押さえておけば、実務に直結する場面でも活用しやすくなります。

ここからは、Python open の基本構文やモード設定、実務での使い方、エラー対策などを順番に学んでいきましょう。

この記事を読むとわかること

  • Python open の基本的な使い方
  • ファイル操作のモードやエンコーディングの指定方法
  • テキストファイル・バイナリファイルの扱い方
  • 例外処理やエラー対策の考え方
  • 実務で意識しておきたいポイントと具体例

Python openとは何か?

Pythonにおける open は、ファイルを開くための関数です。
この関数を呼び出すことで、任意のファイルを読み取り可能な状態や書き込み可能な状態にすることができます。
ファイルを開いたら、そこにあるデータを読み取る、または新たなデータを書き込むといった処理が行えるようになります。

Pythonでファイルを扱う意義

実務の現場では、ログファイルの収集や出力、設定ファイルからの読み取りなどが必要になることがあります。
また、CSVファイルを利用してアプリケーション間のデータを受け渡すケースもあるかもしれません。
こうしたシーンで open を上手に活用できると、ファイルの操作を円滑に進められます。

ファイル操作を正しく行うためには、読み取りだけでなく書き込みや追記などのモードを理解することが大切です。
適切なモードを選択しないと、データを壊してしまったり余計な情報を上書きしてしまったりするリスクが高まります。
そのため、まずはPythonにおけるファイル操作の流れと基本的なモードについて学んでおくと良いでしょう。

open関数の基本構文

ファイルを開くときには、次のような基本構文を使います。

file_object = open("ファイル名", "モード", encoding="文字コード")

最初の引数は開きたいファイルのパスです。
2番目の引数には、読み書きの方法を指定します。
たとえば "r" は読み込み専用で開くという意味です。
3番目の引数である encoding は、テキストファイルを扱うときに文字コードを指定します。
もし特に指定がなければ、システム側のデフォルトエンコーディングになることが多いです。

ファイルを開いた後は read()write() などのメソッドを用いて、ファイルに対して読み込み・書き込みを行います。
処理が終わったら、close() メソッドを呼び出してファイルを閉じることを忘れないようにしましょう。

Python openのモードの種類と特徴

ファイルを開くモードには、用途によっていくつか種類があります。
ここでは、よく使われるモードを中心に紹介します。
適切なモードを選ぶことで、ファイル操作が意図通りに進められます。

読み込みモード: "r"

"r" は読み込み専用のモードです。
既存のファイルからデータを読みたいときに使います。
このモードでファイルを開いた場合、書き込みはできません。
もし指定したパスにファイルが存在しない場合はエラーになります。

読み込み専用ということもあり、ファイルの中身を間違って消してしまう心配が少ないです。
たとえばログファイルを解析するときや、既に用意されているテキストファイルの中身を確認するときなどに役立つでしょう。

書き込みモード: "w"

"w" は書き込み専用のモードです。
ここで気を付けたいのは、指定したパスに既存のファイルがあった場合、そのファイルの中身を初期化してから書き込みを行う点です。
つまり、もともとファイルにあったデータは消去されてしまいます。

したがって、うっかり重要なファイルを "w" モードで開くと、意図せずデータを失う可能性もあります。
新規でファイルを作成したいときには便利ですが、存在するデータを残したまま追記したい場合は、後述の "a" モードや "r+" モードを使うのがおすすめです。

追記モード: "a"

"a" は追記モードです。
既存ファイルの末尾に新たな内容を加えたいときに使います。
たとえばログファイルへ追記する場合や、計測結果をどんどん追加していくような仕組みに向いているでしょう。

もしファイルが存在しない場合は、自動的に新しいファイルが作られます。
ただし、ファイルの先頭部分を上書きすることはできません。
あくまで末尾に文字列が書き加わる仕組みになっています。

上書きモード: "r+"などの複合モード

"r+" は読み込みと書き込みが両方可能です。
すでに存在しているファイルを開いて、中身を読み込みながら必要に応じて書き込むような操作がしたい場合に使われます。
ただし、ファイルの先頭から上書きされるので、扱いには注意が必要です。

このほかにも "w+""a+" のような組み合わせが存在します。
たとえば "w+" であれば、ファイルを初期化してから読み書きできるといった動きになります。
それぞれのモード特性を理解しないまま使うと、意図せずデータを消してしまう可能性があるので慎重に選びましょう。

テキストファイルの扱い方

ファイル操作で最もよく使われるのは、テキストファイルの読み書きではないでしょうか。
データ分析やログ管理、ユーザー設定の保存など、テキスト形式は人間が内容を直接確認しやすいという利点があります。
ここでは、テキストファイルの活用シーンや具体的なコード例を見てみましょう。

実務での活用シーン:設定ファイルやログの読み書き

システム開発で扱う設定ファイルは、キーバリュー形式の簡単なファイルで済ませるケースもあります。
また、エラーや動作状況を記録するログファイルも、多くの場合はテキストファイルとして管理されます。
これらの内容を動的に更新したり解析したりする作業は、Pythonであれば簡単に実装できます。

設定ファイルの場合、"r" モードで読み込んで設定内容を取得し、必要に応じて "w" モードや "a" モードで書き戻すという流れが考えられます。
ログファイルの場合は常に追記していきたいので、"a" モードを使って一定のフォーマットでログを蓄積する方法も一般的です。

テキストファイルの読み込みサンプルコード

テキストファイルからデータを取得する際のシンプルな例を見てみましょう。
ファイル名は "sample.txt" とします。

file_path = "sample.txt"

file_obj = open(file_path, "r", encoding="utf-8")
text_data = file_obj.read()
file_obj.close()

print(text_data)

上のコードでは、read() を呼ぶことでファイルのすべての内容をまとめて文字列として取得しています。
行ごとに取得したい場合は readlines() を使う方法もあります。
複数行にわたるログや設定を処理するときは、行単位で処理を行うと構造がわかりやすくなります。

以下の例は readlines() を使ったものです。

with open("sample.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

for line in lines:
    print(line.strip())  # 各行の末尾にある改行文字を削除してから表示

ここでは with 文を使ってファイルを開いています。
with 文のブロックを抜けると、自動的にファイルが閉じられるのでクローズ漏れを防げます。

テキストファイルの書き込みサンプルコード

続いて、ファイルへ文字列を書き込む例を見てみましょう。
ファイル名が "result.txt" で、書き込む内容が "テスト書き込み" だとします。

with open("result.txt", "w", encoding="utf-8") as f:
    f.write("テスト書き込み\n")

このように "w" モードを使うと、result.txt が存在する場合は中身が上書きされ、存在しない場合は新しいファイルが作成されます。
もし、もとの内容を残しつつ後ろに書き足したい場合は、"a" モードを使うことになるでしょう。

バイナリファイルの扱い方

バイナリファイルとは、テキストファイルとは異なり、人間がそのままでは読めない形式のデータが含まれたファイルです。
画像やPDFなど、アプリケーション固有の形式を扱う際に利用します。
Pythonでバイナリファイルを扱う場合、ファイルを開くモードに "b" を付け加えるのが特徴です。

実務での活用シーン:画像やPDFの処理

ウェブアプリケーションを開発していると、ユーザーがアップロードするファイルをサーバー側で受け取って保存するシーンがよくあります。
たとえば、プロフィール画像やPDFファイルなどを扱う場合は、バイナリ形式で処理することになるでしょう。

Pythonでは、open("image.jpg", "rb") のように "rb" モードでファイルを読み込み、そのデータを変換したり別のファイルに書き込んだりします。
たとえば、受け取った画像データを加工したり、他のシステムに送信したりすることもあります。
一方で、PDFから情報を抜き出すために、バイナリで読み込んだデータを専用ライブラリに渡すケースもあるかもしれません。

バイナリファイルの読み込みサンプルコード

仮に "image.jpg" という名前の画像ファイルを読み込んで、そのデータの一部を表示するシンプルなコード例です。

file_path = "image.jpg"
with open(file_path, "rb") as f:
    data = f.read(100)  # 最初の100バイトだけ読み込む

print(data)

ここでは、一度に全部ではなく先頭100バイトだけを取り出しています。
大きなファイルを扱う場合は、部分的に読み込んで処理を進めることが多いでしょう。

バイナリファイルの書き込みサンプルコード

バイナリファイルに書き込む場合は、例えば新しく copy.jpg を作成するイメージで考えてみます。
あるファイルから読み取ったデータをそのまま別ファイルに書き込むことでコピーを作る方法です。

with open("image.jpg", "rb") as original, open("copy.jpg", "wb") as copied:
    chunk_size = 1024
    while True:
        data_chunk = original.read(chunk_size)
        if not data_chunk:
            break
        copied.write(data_chunk)

このサンプルコードでは、1KBずつ(1024バイト)読み込みながらコピー先に書き込んでいます。
大きなファイルを一度に扱うより、分割して読み書きするとメモリの消費を抑えられます。

エンコーディングとopen関数

テキストファイルを扱うときは、文字コードの指定が重要です。
エンコーディングの違いによって、文字化けが発生する可能性があるからです。
特に日本語を含むファイルを扱う場合は、"utf-8" を指定することが多いでしょう。

UTF-8などの文字コード指定方法

Pythonの open() で文字コードを指定する際は、次のように記述します。

with open("example.txt", "r", encoding="utf-8") as f:
    content = f.read()

こうすると、UTF-8でエンコードされたテキストファイルを正しく読み込みます。
もし文字コードが "shift_jis""cp932" のような形であれば、そこに合わせて指定してください。
異なるエンコーディングを使うファイルを誤って読み込むと、変な記号が表示されたりエラーが出たりする原因になります。

文字化け対策の重要性と実務的ポイント

実務で扱うファイルがすべてUTF-8とは限りません。
過去のシステムや外部ツールで作成されたファイルが別のエンコーディングを使っている場合もあります。
そのため、ファイルのエンコーディングを把握しておくか、何らかの方法で確認する仕組みが必要です。

また、複数のファイルをまとめて処理する場合は、想定外の文字コードに遭遇することもゼロではありません。
そうしたケースに備えて、例外処理でエンコーディングエラーを捕捉してログを残すなどの工夫をすることがあります。

with文を使ったファイル操作

ファイルを扱う際には、明示的に close() を呼んでファイルを閉じる必要があります。
ただし、処理の途中でエラーが起きたり、開いたまま放置してしまったりすると、ファイルのハンドルが残ってしまう恐れがあります。
こうしたクローズ漏れを防ぐ仕組みとして with文 が用いられます。

クローズ漏れを防ぐ方法

with open("filename", "r") as f: のように書くと、withブロックを抜けた時点で自動的にファイルを閉じてくれます。
そのため、明示的に close() を呼ぶ手間も省けるでしょう。
コードがシンプルになるうえに、リソースリークが起きるリスクを低減するので便利です。

ファイル操作においては、できるだけwith文を使うことが推奨されます。

実務における管理の簡略化

実務では、複数のファイルを同時に開いて読み書きすることもあります。
たとえば、あるファイルの内容を処理して別のファイルに出力するようなケースです。
with 文を使うと、それぞれのファイルに対して確実にクローズ処理を行えるので、管理がしやすくなります。

また、少し複雑な例ですが、zip ファイルを開いて展開しながら別のファイルに書き出すなど、いくつものリソースを扱う場面でも with を積極的に活用すると良いでしょう。

エラー処理と例外対応

ファイル操作には、何かしらのエラーがつきものです。
ファイルが存在しない、権限がない、ディスク容量が足りないなど、さまざまな要因が考えられます。
こうした状況に対処するために、Pythonでは try-except 構文を使います。

代表的な例外と対処方法

  • FileNotFoundError: 指定したファイルが見つからない場合
  • PermissionError: ファイルを開く権限がない場合
  • IOError: 一般的な入出力エラーの場合

これらはそれぞれのエラー理由に応じて対策が変わります。
ファイルのパスが正しいか確認する、ディレクトリのパーミッションを見直す、ディスク容量を確保するなど、実務では運用面で解決することも多いでしょう。

try-except構文によるエラー処理のサンプルコード

ファイルが存在しない場合に備えて、サンプルコードでエラー処理を加えてみます。

file_path = "unknown.txt"

try:
    with open(file_path, "r", encoding="utf-8") as f:
        data = f.read()
        print(data)
except FileNotFoundError:
    print("指定のファイルが見つかりませんでした。パスを確認してください。")
except PermissionError:
    print("ファイルにアクセスする権限がありません。権限を確認してください。")
except Exception as e:
    print("予期しないエラーが発生しました:", e)

except Exception as e は、どんな例外でも受け取れるようにするための書き方です。
ここではあまり詳しく条件分岐していませんが、実務環境ではエラー内容に応じて適切な処理を分岐させることが必要になるかもしれません。

実運用では、例外をハンドリングしたうえでエラーログを残し、問題の原因を特定できるようにすることが大切です。

パフォーマンスを意識したファイル操作のポイント

大量のデータを読み込んだり書き込んだりするときは、パフォーマンスの面で工夫が必要です。
特にサイズの大きいファイルを扱う場合、安易に read() で一括読み込みをするとメモリが足りなくなるケースもありえます。
ここでは、大きなファイルの処理やバッファサイズの調整について考えてみましょう。

大量データの読み込みや書き込み

一度にすべて読み込むのではなく、分割して処理を行うことでメモリ使用量を抑えることができます。
先ほど紹介した、バイナリファイルのコピーを1KBずつ行う方法はまさにこの考え方です。
テキストファイルでも同様に、行ごとに読み込む、あるいはある程度のバイト数ごとに読み込むといった方法が有効です。

また、書き込みについても、ある程度の単位でバッファにためてから書き込みを行うと、処理が効率的になることがあります。
ただし、上書き頻度が減るぶん、万一途中でエラーが起きるとファイルの一部しか書き込まれていない可能性があるため、そこは要件に応じた考慮が必要です。

バッファサイズとファイル操作のパフォーマンス

Pythonの open() には、引数でバッファリングの指定を行うことができます。
デフォルト設定でも不便はない場面が多いですが、場合によってはバッファサイズを最適化することでパフォーマンスを向上できるかもしれません。

たとえば、

with open("large_file.txt", "r", buffering=4096, encoding="utf-8") as f:
    ...

のようにすれば、4KBのバッファを使った読み込みを行う形になります。
ただし、これはあくまでシステムやファイルサイズ、I/Oデバイスの特性など複合的な要素に左右されるので、場当たり的に変更しても効果が出るとは限りません。
実際に処理を測定して判断するアプローチが求められるでしょう。

まとめ

ここまで、Python open を使ったファイル操作の基本から、実務につなげやすい応用的な要点までを紹介しました。
テキストファイルとバイナリファイルの違いや、モード指定、エンコーディングの扱い方、エラー処理の基本などを押さえておくと、ファイル操作のトラブルを予防しやすくなります。

特に以下の点は、実際にファイルを扱ううえで忘れやすいので振り返ってみてはいかがでしょうか。

  • ファイルの存在や権限に注意し、エラー処理を適切に行う
  • "w" モードなどで初期化されるリスクを把握しておく
  • バイナリファイルの扱い時には "rb", "wb" などモードを適切に指定する
  • with 文を積極的に使い、クローズ漏れを防止する
  • 文字化けやエンコーディングエラーを回避するために、文字コードを正しく指定する

実務では、設定ファイルの読み書きやログの追記、画像の入出力など、ファイル操作が欠かせない場面が多数あります。
こうしたシーンでPython open を正しく使いこなせると、スクリプトの信頼性や保守性が高まり、作業効率も向上します。

ぜひこの機会に、open() 関数とファイル操作のポイントをしっかりマスターしてみましょう。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。