python 標準ライブラリ io メモリ上にファイルオブジェクトを作成 入出力(I/O)処理

Python

io は Pythonの標準ライブラリ の一つで、入出力(I/O)処理 を扱うためのモジュールです
特に、メモリ上にファイルのようなオブジェクトを作成 できるのが特徴です


io でよく使うクラス

クラス名説明
io.BytesIO()バイナリデータ をメモリ上で扱う(画像・PDF・音声など)
io.StringIO()文字列データ をメモリ上で扱う(テキストデータの操作)

io.BytesIO() の実用例(画像を一時保存)

前回の記事で紹介したmplfinance で生成した画像をメモリ上に保存し、ファイルに書き込まずに Discord に送信するコードを紹介します

前回の記事はこちらです

生成したグラフをメモリに保存するところだけを紹介します
コード全体は前回の記事を確認してください

# 画像をメモリ上に保存(io.BytesIOを使用)
buf = io.BytesIO()
mpf.plot(df, type="candle", style=s, volume=True, mav=(25, 75), figratio=(10, 6),
         panel_ratios=(3, 1), title=f"{ticker} 1-Year Candlestick Chart", savefig=buf  # ここで直接メモリに保存
)
buf.seek(0)  # バッファの先頭に移動
return buf

コードの解説

buf = io.BytesIO()

bufというバイナリデータを扱うオブジェクトを生成します

mpf.plot(df, type="candle", style=s, volume=True, mav=(25, 75), figratio=(10, 6),
panel_ratios=(3, 1), title=f"{ticker} 1-Year Candlestick Chart", savefig=buf)

グラフを描画して savefig=buf で画像をbufに(メモリ上)に保存します

buf.seek(0)

取り出すためにバッファの先頭に移動します

return buf

関数の戻り値としてbufを返します


メモリ上のオブジェクトの処理

また、今回のコードでは保存されたメモリ上のオブジェクトは、関数で使用しているため、関数を抜けた後に自動的に削除されます

  • ticker() 関数が終了すると buf はスコープ外になる
  • その結果、誰も buf を参照しなくなる

そのためPythonのガベージコレクション(GC)が buf を削除

  • 参照がなくなった buf は自動的に削除される(ガベージコレクション)
  • io.BytesIO() はファイルを保存しないため、メモリ上のデータも解放される
  • buf.close() を明示的に呼ばなくても、関数を抜けた時点で buf は消える

最初は毎回ファイル名を付けて保存していましたが、どんどんファイルが増えてしまうので削除する必要がありました

でも、ファイルがないとDiscord botで送信できないと考えていたところにioモジュールの存在に気づきました

他にも応用できると思うのでぜひ活用してみてください

コメント