ファイルの読み込み、書き込み | ファイルの読み書き | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

ファイルの読み込み、書き込み

Pythonでプログラムの外部にあるデータを処理したり、計算結果をファイルとして保存したりする際、避けて通れないのがファイル操作(I/O:Input/Output)の技術です。

Pythonでは標準機能として open() 関数が用意されており、テキストファイル(.txt.csv など)の読み込みや書き込みを数行のコードで実現できます。ファイル操作は「開いたら必ず閉じる」というメモリ管理の絶対ルールがあるため、その安全な実装パターンを含めて解説します。

基本的なファイルのオープンとクローズ(手動管理)

ファイルを操作する際の最も原始的な手順は、open() でファイルオブジェクトを生成し、処理が終わったら close() メソッドで明示的にファイルを閉じる方法です。

# 読み込みモード('r')でファイルを開く
file = open('sample.txt', 'r', encoding='utf-8')

# ここでファイルの内容を読み書きする処理を行う

# 処理が終わったら必ず閉じる(閉じ忘れるとメモリを占有し続け、ファイルが破損する原因になります)
file.close()

実務の標準:with構文による自動クローズ

前述の手動クローズ(file.close())は、処理の途中でエラー(例外)が発生すると実行されずにプログラムがクラッシュし、ファイルが「開きっぱなし」になる致命的なバグを誘発します。

このリスクを完全に解消するのが with 構文(コンテキストマネージャ) です。with ブロックを抜けた時点で、正常終了・エラー終了を問わず、Pythonが背後で自動的にファイルをクローズしてくれます。

# with構文を使えば、close()の記述自体が不要になります
# encoding='utf-8' を明記することで、WindowsやMacなどの環境依存による文字化けを防ぐのが実務の鉄則です
with open('sample.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
# ブロックを抜けた瞬間に、ファイルは安全に閉じられています

テキストファイルを「読み込む」3つのメソッド

ファイルを開いた後、中身のテキストを取り出すにはデータの規模や用途に応じて3つのアプローチを使い分けます。

メソッド名 データの取得形式 メモリ上の挙動と実務での使いどころ
read() ファイル全体を1つの巨大な文字列(str)として一括取得。 設定ファイルや、容量の小さいテキストを一気に処理したいときに最適。数GBある大容量ファイルで使うとメモリ不足(OOM)でクラッシュします。
readline() ファイルの現在の位置から1行だけを文字列として取得。 呼び出すたびに次の行へ進みます。メモリをほとんど消費しないため、巨大なログファイルを上から順番に監視・走査したいときに有効です。
readlines() ファイル全体を改行ごとに分割し、文字列のリスト(list)として取得。 ['1行目の内容\n', '2行目の内容\n'] のように返るため、特定の行番号(インデックス)を指定してデータを抽出したいときに便利です。

読み込みメソッドの具体的なコード例

# 1. readlines() で行ごとのリストとして処理する例
with open('sample.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for index, line in enumerate(lines):
        # strip() を使うことで、行末の不要な改行コード('\n')を取り除いて出力できます
        print(f"{index + 1}行目: {line.strip()}")

# 2. 効率的アプローチ(実はファイルオブジェクトはそのままfor文で1行ずつループ可能です)
with open('sample.txt', 'r', encoding='utf-8') as file:
    # readlines()すら使わず、1行ずつメモリに読み込むため超巨大ファイルでも安全です
    for line in file:
        if "ERROR" in line:
            print(line.strip())

テキストファイルへ「書き込む」モードの使い分け

ファイルに文字を書き込む際は、open() の第2引数に渡すモード文字列によって挙動が激変するため、細心の注意が必要です。

モード 動作仕様 既存ファイルがある場合の挙動(重要)
'w'
(Write)
新規書き込みモード。ファイルが存在しない場合は新しく自動作成します。 既存の中身をすべて跡形もなく消去(上書き)し、完全にゼロから書き直します。データ紛失のリスクがあるため取り扱いに注意。
'a'
(Append)
追記モード。ファイルが存在しない場合は新しく自動作成します。 既存のデータには一切触れず、ファイルの現在の末尾(最下行)から続きを追記します。アクセスログの蓄積などに多用されます。

書き込み・追記メソッドの具体的なコード例

# 1. 'w' モードによる上書き操作
with open('output.txt', 'w', encoding='utf-8') as file:
    # write()メソッドは自動で改行されないため、改行したい位置に '\n' を手動で入れる必要があります
    file.write('最初の行です。\n')
    file.write('2行目の内容です。\n')

# 2. 'a' モードによる追記操作(既存の output.txt の後ろにデータを足す)
with open('output.txt', 'a', encoding='utf-8') as file:
    file.write('追記モードで足された3行目のテキストです。\n')

まとめ

  • ファイル操作は with 構文が絶対ルール: 手動での close() はバグの温床です。予期せぬエラーが起きても確実にシステムがファイルを解放してくれるよう、必ず with open(...) as file: の定型文を使いましょう。
  • encoding='utf-8' を省略しない: 開発環境(Macなど)で動いても、本番環境(Windows Serverなど)へ持っていった瞬間に日本語が文字化けしてシステムが落ちる原因になります。オープン時は常にエンコーディングを明示してください。
  • 'w' モードの破壊力に注意する: 'w' はファイルを開いた瞬間に、中にあった過去のデータをすべて消去します。単にログを後ろに追加していきたいケースなどでは、必ず末尾追記の 'a' モードを選択する設計思考を持ってください。