Как сохранить диаграмму matplotlib во временный файл на python?

#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, я думаю.