#python #matplotlib #praat
Вопрос:
Мне нужно сохранить график Matplot во временный файл, которым я управляю, так как этот код будет находиться в службе отдыха python Flask.
Я попробовал это:
fp = временный файл.NamedTemporaryFile() return_base64 = «»
with fp:
fp.write(plt.savefig) # THIS IS WRONG....
with open(fp.name, 'rb') as open_it:
open_it.seek(0)
return_base64 = str(base64.b64encode(open_it.read()))
# strip off leading b and ' and trailing '
return_base64 = return_base64[2: len(return_base64) - 1]
open_it.close()
fp.close()
Но «fp.write» не работает с сохранением plt.savefig, как я сделал выше.
Моя проблема в том, что я использую фонетическую библиотеку PRAAT, и, похоже, нет способа использовать метод «Sound()» внутри службы REST. Таким образом, я создаю множество временных файлов, чтобы обойти это.
Итак, как мне записать график matplotib в именованный временный файл?
Заранее выражаю признательность и благодарность.
Комментарии:
1. каким образом это отвечает на мой вопрос?
2. извини, я виноват. я не до конца прочитал ваш вопрос
3. есть ли какое-либо практическое применение модуля temp ? я думаю, что нормально
open
сработает .fp.write()
используйтеbytes
для записи, и вы назначаете просто функциюplt.savefig
. другое предложение заключается в том, что вам не нужно вручную удалять строку, которую вы можете использоватьreturn_base64.decode()
, вернет строку .4. Как мне получить «байты» из plt.savefig? Я не вижу никакого способа получить байты из объекта plt.
5. Это сбивает с толку, почему «plt.savefig(fp.name)» не работает. В fp.name указывает временный путь, но после этого выполняется выполнение «ls-la» в этом временном файле, показывающем ноль байтов.
Ответ №1:
я делюсь этим кодом, он хранит файл jpg в моей временной папке
import io
buf = io.BytesIO()
plt.savefig(buf, format="jpg")
#print(buf.getvalue()) return bytes of plot
fp = tempfile.NamedTemporaryFile()
# print(fp.name) return file name
with open(f"{fp.name}.jpg",'wb') as ff:
ff.write(buf.getvalue())
buf.close()
Комментарии:
1. Это здорово, спасибо! Мне действительно не нужен временный файл, так как я могу просто вернуть buf в кодировке base64, я думаю.