ファイルの開閉と基本操作
ファイルは open() 関数で開き、read() や write() で読み書きします。
明示的に close() する方法もありますが、with 文を使うことでブロック終了時に自動で閉じられるため安全です。
モードとしては ‘r’(読み取り)、’w’(書き込み)、’a’(追記)、’b’(バイナリ)などがあります。
エンコーディングはテキストファイルを扱う際に明示しておくとクロスプラットフォームでのトラブルを減らせます。
# 書き込みと読み込みの例 with open("sample.txt", "w", encoding="utf-8") as f: f.write("Hello, GAMEWORKS LAB\n") with open("sample.txt", "r", encoding="utf-8") as f: text = f.read()
バイナリファイルの扱い
画像や音声などバイナリデータは ‘rb’ / ‘wb’ モードで扱います。
バイト列(bytes)として読み書きするため、テキスト向けのエンコーディング指定は不要です。
大きなファイルを扱う際はストリーム処理やチャンク分割を検討してください。
# バイナリ読み書きの例 with open("image.png", "rb") as src: data = src.read() with open("copy.png", "wb") as dst: dst.write(data)
例外処理の基本
例外処理は try / except / finally を用いて行います。
予期されるエラー(例えば FileNotFoundError や PermissionError)は個別に捕捉して適切に対応し、最後に必要な後処理があれば finally で行います。
汎用的な Exception を捕捉する場合はログ出力やエラーメッセージの提示など、原因調査のための情報を残すことが重要です。
# 例外処理の例 try: with open("nonexistent.txt", "r", encoding="utf-8") as f: data = f.read() except FileNotFoundError as e: print("ファイルが見つかりません。", e) except Exception as e: print("予期せぬエラーが発生しました。", e) finally: print("終了処理")
意図的な例外発生とカスタム例外
関数やライブラリ内部で条件に応じて例外を発生させることがあります。
raise 文で ValueError 等を投げると呼び出し側で適切に処理できます。
独自のエラーを明確に扱いたい場合は Exception を継承したカスタム例外クラスを定義すると、捕捉と分類がしやすくなります。
# raise とカスタム例外の例 class InvalidDataError(Exception): pass def divide(a, b): if b == 0: raise ValueError("0 で除算はできません。") return a / b def process(data): if not isinstance(data, dict): raise InvalidDataError("辞書型のデータを期待しています。")
よくあるトラブルと対処法
主なトラブルはパーミッションやエンコーディングの不一致です。
書き込み権限のないディレクトリに保存しようとすると PermissionError が発生します。
ファイルの文字コードが期待と異なる場合は UnicodeDecodeError が起きるので、読み込み時にエンコーディングを指定するか、バイナリ読み込みで調査してください。
機能 | 留意点 |
---|---|
open() | モードとエンコーディングを明示する。不要な上書きを避ける。 |
with | リソースの自動解放に有効。推奨される使い方。 |
try/except | 想定される例外は個別に捕捉し、診断情報を残す。 |