¿Cómo puedo generar un archivo sobre la marcha y borrarlo después de descargarlo?

Aquí está mi función que crea un archivo sobre la marcha (cuando el usuario hace clic en el enlace apropiado)

@app.route('/survey//report') def survey_downloadreport(survey_id): survey, bsonobj = survey_get(survey_id) #get object resps = response_get_multi(survey_id) #get responses to the object fields = ["_id", "sid", "date", "user_ip"] #meta-fields fields.extend(survey.formfields) #survey-specific fields randname = "".join(random.sample(string.letters + string.digits, 15)) + ".csv" #some random file name with open("static//" + randname, "wb") as csvf: wr = csv.DictWriter(csvf, fields, encoding = 'cp949') wr.writerow(dict(zip(fields, fields))) #dummy, to explain what each column means for resp in resps : wr.writerow(resp) return send_from_directory("static", randname, as_attachment = True) 

Me gustaría tener un archivo para ser eliminado después de completar la descarga. ¿Cómo puedo hacerlo?

En Linux, si tiene un archivo abierto, aún puede leerlo incluso cuando se elimina. Hacer esto:

 import tempfile from flask import send_file csvf = tempfile.TemporaryFile() wr = csv.DictWriter(csvf, fields, encoding = 'cp949') wr.writerow(dict(zip(fields, fields))) #dummy, to explain what each column means for resp in resps : wr.writerow(resp) wr.close() csvf.seek(0) # rewind to the start send_file(csvf, as_attachment=True, attachment_filename='survey.csv') 

El archivo csvf se elimina tan pronto como se crea; el sistema operativo reclamará el espacio una vez que se cierre el archivo (que cpython hará por usted tan pronto como se complete la solicitud y se elimine la última referencia al objeto del archivo). Opcionalmente, puede usar el gancho after_this_request para cerrar explícitamente el objeto de archivo.

He usado os.unlink por un tiempo con éxito:

 import os os.unlink(os.path.join('/path/files/csv/', '%s' % file)) 

Espero eso ayude.