今回は、Pythonのread, readline, readlinesメソッドの違いと、正しい使い方についてご紹介します。
ファイル読み込み3つのメソッドの概要
Pythonでファイルを読み込む際には、主にread()、readline()、readlines()の3つのメソッドが活用されます。
これらは一見似ていますが、読み込み結果の形式やメモリの使用量が異なるため、目的やファイルサイズに応じて使い分ける必要があります。
ここでは、それぞれの特徴や使い方を見ていきます。
read()の特徴と使い方
read()は、ファイルの中身をすべてまたは指定した文字数だけ、一括して文字列として読み込みます。
一度に全て読み込むため、ファイルサイズが大きい場合はメモリを大量に消費する恐れがあります。
ファイルを開いたら、以下のようにread()を使います。
1 2 3 |
with open("example.txt", "r", encoding="utf-8") as f: content = f.read() print(content) |
上記のコードでは、example.txtの中身がすべてcontentに格納されます。
たとえば、example.txtに次のような内容がある場合を想定します。
Hello, Python!
This is a sample file.
このとき、print関数で出力される結果は以下のとおりです。
Hello, Python!
This is a sample file.
なお、大量のデータを扱うファイルではメモリ不足になる可能性があるため、適宜サイズを確認したうえで利用することが望ましいです。
readline()の特徴と使い方
readline()は、ファイルを1行ずつ読み込むメソッドです。
1度の呼び出しで1行だけ取得できるため、行ごとに処理を行いたい場合や、ファイルが大きくてもメモリを抑えながら読み込みたいときに適しています。
サンプルコードは以下のようになります。
1 2 3 4 5 6 |
with open("example.txt", "r", encoding="utf-8") as f: while True: line = f.readline() if not line: # 空文字ならファイルの末尾(EOF) break print(line, end="") |
上記の例では、readline()によって1行ずつ読み込まれ、lineが空文字になった時点でループを終了します。
なお、lineには改行文字(\n)が含まれますので、print関数ではend=""
を指定して重複しないようにしています。
readlines()の特徴と使い方
readlines()は、ファイルの中身をすべて読み込み、各行を要素とするリストとして返すメソッドです。
扱い方はシンプルで、一気に全行を得られる反面、大きなファイルを読み込むと大量のメモリを消費する点は注意が必要です。
サンプルコードは以下のようになります。
1 2 3 4 |
with open("example.txt", "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: print(line, end="") |
上記のコードでは、linesは各行を要素としたリストとなります。
よくあるエラーと対策
ファイル読み込みで起こりやすいエラーや注意点としては以下のようなものがあります。
- FileNotFoundError: 指定したファイルが存在しないときに発生します。パスを確認するか、実行場所を見直すことで対処可能です。
- UnicodeDecodeError: 読み込むファイルの文字コードと、
encoding
で指定した文字コードが合わない場合に発生します。正しいエンコーディングを設定する必要があります。 - MemoryError:
read()
やreadlines()
で非常に大きなファイルを読み込むと、メモリ不足が発生することがあります。readline()
を使った行ごとの処理や、ファイルオブジェクトをループで回す方法を検討すると良いでしょう。 - 改行コードの扱い:
readline()
やreadlines()
で得られる文字列には改行コード(\n)が含まれます。不要な場合はrstrip()
などで除去できます。
まとめ
Pythonでファイルを読み込む際には、使い方や目的、ファイルサイズに応じてread系メソッドを選択することが重要です。
一気に読み込みたい場合はread()
、行単位で処理したい場合はreadline()
、リスト形式が必要な場合はreadlines()
を使うと効率的です。
正しい使い分けによってメモリ消費やエラーを回避し、快適に開発を進められます。