python - открыть файлоподобный объект по имени файла
Я хочу создать файлоподобный объект, который позже будет открыт по имени файла. Возможно ли это сделать? Я ищу что-то вроде этого:
import io
fileLikeObject = io.BytesIO()
fileLikeObject.write((b"randomContent")
fileLikeObject.name = "someFilename.txt"
sameFileAsbefore = open("someFilename.txt", "rb")
sameFileAsbefore.read()
Я смотрел на эту тему, но файл не доступен по его имени впоследствии.
Для полноты я хочу специально создать синусоидальный сигнал и играть в среде Android. Вот код, адаптированный из этого ответа.
from kivy.core.audio import SoundLoader
from kivy.base import runTouchApp
from kivy.uix.button import Button
import time
# Wave parameters
fs = 44100 # sampling frequency
duration = 2 # seconds
# Generating waveforms
timePoints = np.linspace(0, duration, duration*fs)
sineWave = np.sin(2 * np.pi * 440 * timePoints) # 440 Hz
outdata = np.transpose(np.tile(volume*outputWave, (2,1)))
class MyLabel(Button):
def on_release(self):
start_time = time.time()
self.play_sound()
print("--- %s seconds ---" % (time.time() - start_time))
def play_sound(self):
bytes_out = io.BytesIO()
wavfile.write(bytes_out, fs, outdata)
bytes_out.seek(0)
sound = SoundLoader.load(bytes_out) # only loads by filename :/
sound.seek(0)
if sound:
print("Sound found at %s" % sound.source)
print("Sound is %.3f seconds" % sound.length)
sound.play()
runTouchApp(MyLabel(text="Press me for a sound"))
Я также открыт для других решений, которые позволяют мне воспроизводить машинные звуки на Android. Спасибо за помощь!
1 ответ
Как говорится, "преждевременная оптимизация - источник всего зла", верно?
Основываясь на комментарии @fins, я создал временные файлы для хранения аудио, используя временный файл библиотеки. Он автоматически уничтожает файл при его закрытии.
Вот рабочая версия для того, что я отправил в вопросе:
from kivy.core.audio import SoundLoader
from kivy.base import runTouchApp
from kivy.uix.button import Button
from scipy.io import wavfile
import time
import tempfile
import numpy as np
# Wave parameters
fs = 44100 # sampling frequency
duration = 2 # seconds
# Generating waveforms
timePoints = np.linspace(0, duration, duration*fs)
sineWave = np.sin(2 * np.pi * 440 * timePoints) # 440 Hz
outdata = np.transpose(np.tile(sineWave, (2,1)))
class MyLabel(Button):
def on_release(self):
start_time = time.time()
self.play_sound()
print("--- %s seconds ---" % (time.time() - start_time))
def play_sound(self):
f = tempfile.NamedTemporaryFile(suffix = '.wav', delete=True)
wavfile.write(f, fs, outdata)
f.seek(0)
sound = SoundLoader.load(f.name)
if sound:
print("Sound found at %s" % sound.source)
print("Sound is %.3f seconds" % sound.length)
sound.play()
f.close()
runTouchApp(MyLabel(text="Press me for a sound"))