1. はじめに
Pythonではファイルを操作する際に、「ストリーム処理」という方法を使うことで、大容量ファイルでも効率よく読み書きすることが可能です。この記事では、Pythonでファイルをストリームで処理する方法を、初心者にもわかりやすく丁寧に解説します。
ストリーム処理を使えば、メモリを圧迫することなく1行ずつ読み込んだり、書き出しをリアルタイムに行うことができます。ログ解析、大量データ処理、リアルタイム出力など、多くの実務で活用できるテクニックです。
本記事では、基本的な使い方から応用、エラー対策まで網羅的に紹介します。Pythonで効率よくファイルを扱いたい方はぜひ参考にしてください。
2. Pythonのストリーム処理の基本
ストリーム処理とは?
ストリーム処理とは、ファイルの中身を一括ではなく「少しずつ処理」することです。Pythonではopen()
関数を使い、テキストファイルやバイナリファイルを逐次読み書きできます。
基本の構文と例
ファイルの中身を1行ずつストリームで読み込む基本コードは以下の通りです。
# ファイルを1行ずつ読み込むストリーム処理
with open("sample.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
実行結果:
1行目の内容
2行目の内容
3行目の内容
このようにwith open()
とfor line in f
を使うことで、ストリーム形式でファイルを扱えます。
3. よくある使い方・応用例
大きなCSVファイルの読み取り
例えば、数GBにおよぶCSVファイルを読み取る際も、ストリーム処理で対応可能です。
import csv
# 大きなCSVを1行ずつ処理
with open("large_data.csv", "r", encoding="utf-8") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
実行結果:
['id', 'name', 'score']
['1', 'Alice', '90']
['2', 'Bob', '85']
標準入力との組み合わせ(リアルタイム処理)
標準入力からのデータをストリーム処理することも可能です。これにより、コマンドラインツールのような使い方もできます。
import sys
print("入力をどうぞ(Ctrl+Dで終了):")
for line in sys.stdin:
print("受け取った内容:", line.strip())
実行結果:
入力をどうぞ(Ctrl+Dで終了):
こんにちは
受け取った内容: こんにちは
テスト
受け取った内容: テスト
バイナリファイルの読み書き
画像やPDFなどのバイナリファイルも、ストリームで扱うことができます。
# バイナリファイルの読み取り
with open("image.png", "rb") as f:
data = f.read(1024) # 1024バイトずつ読み取り
while data:
# ここで処理(例:出力)
print(len(data))
data = f.read(1024)
実行結果:
1024
1024
1024
...
4. 注意点・エラー対策
ファイルが存在しない場合
ファイルが存在しない場合、FileNotFoundError
が発生します。以下のように対策します。
try:
with open("not_found.txt", "r") as f:
content = f.read()
except FileNotFoundError:
print("ファイルが見つかりません")
実行結果:
ファイルが見つかりません
文字コードエラー(UnicodeDecodeError)
読み込むファイルのエンコーディングが合っていないと、UnicodeDecodeErrorが出ます。
その場合はencoding="utf-8"
やencoding="shift_jis"
などを指定してください。
バイナリとテキストのモードを区別する
“rb”や”wb”はバイナリ、”r”や”w”はテキストモードです。間違えると処理に失敗します。
5. まとめ
この記事ではPythonでファイルをストリームで処理する方法について解説しました。メモリ効率の良さや、逐次処理の強みを活かして、実務でもよく使われるテクニックです。
- ファイルを1行ずつ読み込む方法
- CSVや標準入力、バイナリファイルの応用
- エラー対策とモード指定の重要性
ストリーム処理は、大容量データを扱う業務やバッチ処理で非常に役立ちます。ログ解析やファイル分割など、学習後すぐに応用できるので、ぜひ実践で活用してください!