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モジュールの存在に気づきました
他にも応用できると思うのでぜひ活用してみてください
コメント