Привет.
Пишу на python, использую стандартную библиотеку JSON.
Мне нужно записать файл .mp3 в JSON, но проблема в том что когда я пытаюсь вызватьjson.dumps(), и подать в него такой dict: {"file":b"My audio file in bytes"}
Мне выдает ошибку что нельзя записать байты.
Как мне записать .mp3 (Т.Е. байтовое значение) в JSON?
Хранить mp3 вполне логично в файлах в каталоге проекта.
Если вы по какой-то причине не хотите хранить их россыпью в файловой системе, то можно собрать их в zip-файл без сжатия или в tar-архив. С ними можно работать не распаковывая, открыать и читать файлы внутри.
Ещё есть встроенный модуль shelve - это персистентный key-value storage, который держит свои ключи и значения в одном файле. Доступны чтение и запись бинарных данных по ключу.
Base64 приведёт к тому что объём данных увеличится примерно на четверть (на 25 процентов). Сериализация и десериализация больших файлов в текстовый json будет медленным и неэффективным.
Опишите шире вашу задачу и вам предложат типовое ее решение.
Я решил распихивать по файловой системе, записывая в JSON данные которые мне нужны к звукам.
Моя задача: компактно записать звук, и данные к нему (не имя файла, а описание что за звук.)
Stepan Sidorov, У mp3 ормата есть id3-теги. Они вписываются в специальной структуре в начало файла. Есть много разных утилит и библиотек для работы (чтения\записи) этих тегов. Если описание не слишком объемное, то можновоспользоваться этой структурой.
Сергей Паньков, Т.Е. предлагаете: хранить файлы в zip, и описание файлов хранить в id3 тегах?
Да, решение хорошое. Правда я уже сделал по другому, просто в JSON файле сохранял пути к файлам .mp3, и там в JSON уже записывал все что мне нужно.
Спасибо за решение.
Stepan Sidorov, да смотря какие бизнес-требования к хранению. Может быть вам надо. чтобы при переносе файлов целостность не страдала, тогда каталоги и id3. Если нужна скорость, то индексные таблицы с метаданными и файлы позади кэша. Если компактность и порядок инсталляции в файловой системе, то архив и id3. Если скорость поиска по метаданным, то БД (sqlite) и файлы.
Слишком мало данных по вашей задаче, а вариантов много.
Stepan Sidorov, Data URI можно вставить в строку адреса, браузер сам извлекает из DataURI файл. Чтобы использовать можно выполнить код(new Audio("data:@audio/mp3;base64,....")).play()
kocherman, Я использую JS для записи звуков (с браузера). Но потом это отправляется на сервер через fetch. И там я уже должен его сохранить. Собирался в JSON, но видимо придется как файл сохранять.