Python 入門

Python ファイル読み込み

データの読み込み方法を深く学ぶ前に、まずはファイルをオープンする方法を簡単に復習しましょう。これは極めて重要な第一歩です。Python では、ファイルをオープンするために open() 関数を使用します。前章の内容を振り返ると、基本構文は open(filename, mode) です。mode パラメータは、ファイルをオープンする目的(読み込み、書き込み、追記など)を指定します。本章では、主に読み込みモード('r')に焦点を当てます。

ファイルの使用が終わったら、close() メソッドを使ってクローズすることが非常に重要です。これによりシステムリソースが解放され、潜在的な問題を防止できます。Python にはガベージコレクション機構があり、ファイルが参照されなくなったときに自動的にクローズされますが、この機構に依存することはベストプラクティスとは言えません。

ファイル処理においてより安全で Pythonic(Python らしい)な手法は、with ステートメントを使用することです。with ステートメントは、処理中にエラーが発生した場合でも、ファイルのクローズを自動的に受け持ってくれます。これにより、ファイルが常に正しくクローズされることが保証されます。

# 'with' ステートメントを使用してファイルを読み込み用にオープンする例
filename = "my_file.txt" # このファイルが存在すると仮定します(後ほど作成します)。

try:
    with open(filename, 'r') as file:
        # ここでファイル操作を行います
        pass # この例ではまだ何も操作していませんが、コードの構造を示しています。
    # 'with' ブロックが終了すると、ファイルは自動的にクローズされます
except FileNotFoundError:
    print(f"エラー:ファイル '{filename}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました:{e}")

1. ファイルデータの1行ずつ読み込み

ファイルからデータを読み込む一般的な方法の1つは、1行ずつ読み込むことです。メモリに収まりきらないような大容量ファイルを扱う場合、この手法は特に有効です。Python では、1行ずつ読み込むためのいくつかの方法が提供されています。

1.1 for ループの使用

1行ずつ読み込む最もシンプルで Pythonic な方法は、ファイルオブジェクトに対して直接 for ループを使用することです。この方法でファイルオブジェクトを反復処理すると、Python は自動的に1行ずつ読み込みます。

filename = "my_file.txt"

try:
    with open(filename, 'r') as file:
        for line in file:
            # 各行を処理
            print(line.strip())  # 行頭および行末の空白文字を削除
            
except FileNotFoundError:
    print(f"エラー:ファイル '{filename}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました:{e}")

この例のポイント:

  • with ステートメントを使用して、読み込みモード('r')で "my_file.txt" をオープンしました。
  • for line in file: はファイル内の各行をループします。
  • ループ内部で、line はファイル内の単一のテキスト行を表し、末尾の改行文字(\n)を含みます。
  • line.strip() は、先頭または末尾の空白文字(改行文字を含む)を削除し、出力を整えます。
  • try...except ブロックを追加し、ファイルが見つからないなどのエラーに対処しています。

実行例:

my_file.txt に以下の内容が含まれているとします:

This is the first line.
This is the second line.
And this is the third.

上記のコードを実行した結果:

This is the first line.
This is the second line.
And this is the third.

1.2 readline() の使用

1行ずつ読み込むもう1つの方法は、readline() メソッドを使用することです。このメソッドはファイルから単一の行を読み込み、それを文字列として返します。その後、readline() を呼び出すたびにファイル内の次の行が返されます。ファイルの末尾に達すると、readline() は空文字列("")を返します。

filename = "my_file.txt"

try:
    with open(filename, 'r') as file:
        line = file.readline()
        while line:
            print(line.strip())
            line = file.readline()
            
except FileNotFoundError:
    print(f"エラー:ファイル '{filename}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました:{e}")

この例のポイント:

  • 読み込みモードで "my_file.txt" をオープンします。
  • line = file.readline() でファイルの最初の行を読み込みます。
  • readline() が空でない文字列を返す限り(ファイルの末尾に達していないことを意味します)、while line: ループが継続されます。
  • ループ内で、行の内容をプリント(空白削除後)し、次の line = file.readline() で次行を読み込みます。
  • try...except ブロックで潜在的なエラーを処理しています。

この方法は for ループを使うよりも少し冗長ですが、読み込みプロセスをより明示的に制御できます。

注意:空行について
ファイル内の特定の行が本当の空行(改行文字のみを含む)である場合、readline()\n を返します。このとき strip() メソッドを適用するとそれが削除され、結果として空文字列がプリントされます。もし空行とファイルの終端を区別する必要がある場合は、strip() を呼び出す前に line の値をチェックする必要があります。

2. ファイル全体の読み込み

ファイルの内容すべてを単一の文字列として読み込む必要がある場合もあります。これは、メモリ使用量が問題にならない小規模なファイルに適しています。Python はこのために read() メソッドを提供しています。

2.1 read() の使用

read() メソッドは、現在のファイルポインタの位置からファイルの全内容を読み込み、それを1つの文字列として返します。ファイル全体を読み込んだ後に再度 read() を呼び出すと、空文字列が返されます。

filename = "my_file.txt"

try:
    with open(filename, 'r') as file:
        content = file.read()
        print(content)
        
except FileNotFoundError:
    print(f"エラー:ファイル '{filename}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました:{e}")

この例のポイント:

  • 読み込みモードで "my_file.txt" をオープンします。
  • content = file.read() でファイルの全内容を1つの文字列として content 変数に読み込みます。
  • その後、ファイルの内容全体をプリントします。
  • try...except ブロックで潜在的なエラーを処理しています。

実行例:my_file.txt の内容:

This is the first line.
This is the second line.
And this is the third.

実行結果:

This is the first line.
This is the second line.
And this is the third.

2.2 読み込む文字数を指定する場合

read() メソッドは、オプションの引数として「読み込む文字数」を受け取ることができます。ファイルを分割して読み込みたい(チャンク処理)場合に非常に便利です。

filename = "my_file.txt"

try:
    with open(filename, 'r') as file:
        chunk1 = file.read(10)  # 最初の10文字を読み込む
        print("チャンク 1:", chunk1)
        
        chunk2 = file.read(15)  # 次の15文字を読み込む
        print("チャンク 2:", chunk2)
        
except FileNotFoundError:
    print(f"エラー:ファイル '{filename}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました:{e}")

この例では、最初の read(10) でファイルの先頭10文字を読み込みます。2回目の read(15) は、最初の呼び出しが停止した位置から開始し、次の15文字を読み込みます。

例えば my_file.txt の内容が "This is some text in the file." の場合、出力は以下のようになります:

チャンク 1: This is so
チャンク 2: me text in the

3. 読み込みメソッドの比較

メソッド読み込み方式メモリ消費量最適なユースケース
for ループ1行ずつ低(効率的)大容量ファイル、行ごとの逐次処理
readline()1行ずつ低(効率的)大容量ファイル、読み込みの明示的な制御が必要な場合
read()ファイル全体高(内容に依存)中小規模のファイル、単純な一括処理