1. ホーム
  2. python

インメモリファイルオブジェクトの作成方法

2023-11-05 23:47:12

質問内容

pygame mixerで使用するインメモリファイルを作りたいのですが、どのようにすればよいですか?つまり、以下のようなものです。 http://www.pygame.org/docs/ref/music.html#pygame.mixer.music.load のように、load()メソッドがファイルオブジェクトをサポートすると言っています。

import requests
from pygame import mixer

r = requests.get("http://example.com/some_small_file.mp3")
in_memory_file = file(r.content) # something like this
mixer.music.init()
mixer.music.load(in_memory_file)
mixer.music.play()

どのように解決するのですか?

あなたが探しているのは BytesIO または StringIO クラスはPythonから io パッケージで利用可能です。 Python 2 パイソン3 . これらは、実際のファイルと全く同じようにコードで使用できる、ファイルのようなインターフェイスを提供します。

StringIO は、テキストデータを保存するために使用されます。

import io

f = io.StringIO("some initial text data")

BytesIO はバイナリデータに使用されなければなりません。

import io

f = io.BytesIO(b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01")

MP3 ファイルのデータを保存するためには、おそらく BytesIO クラスが必要でしょう。サーバへの GET リクエストから初期化するには、次のようにします。

import requests
from pygame import mixer
import io

r = requests.get("http://example.com/somesmallmp3file.mp3")
inmemoryfile = io.BytesIO(r.content)

mixer.music.init()
mixer.music.load(inmemoryfile)
mixer.music.play()

# This will free the memmory from any data
inmemoryfile.close()

追記:どちらのクラスも IOBase を継承しているため、コンテキスト・マネージャーとして with ステートメントを使用することで、手動で close() メソッドを手動で呼び出す必要はありません。

import requests
from pygame import mixer
import io

r = requests.get("http://example.com/somesmallmp3file.mp3")

with io.BytesIO(r.content) as inmemoryfile:
    mixer.music.init()
    mixer.music.load(inmemoryfile)
    mixer.music.play()