Python 如何动态生成文件并在下载后将其删除?

Python 如何动态生成文件并在下载后将其删除?,python,flask,Python,Flask,下面是我的函数,它可以动态创建文件(当用户单击适当的链接时) @app.route(“/survey//report”) def调查下载报告(调查id): survey,bsonobj=survey_get(survey_id)#get对象 resps=响应_获取_多重(调查_id)#获取对对象的响应 字段=[“\u id”、“sid”、“日期”、“用户\u ip”]#元字段 字段.扩展(survey.formfields)#调查特定字段 randname=”“.join(random.samp

下面是我的函数,它可以动态创建文件(当用户单击适当的链接时)

@app.route(“/survey//report”)
def调查下载报告(调查id):
survey,bsonobj=survey_get(survey_id)#get对象
resps=响应_获取_多重(调查_id)#获取对对象的响应
字段=[“\u id”、“sid”、“日期”、“用户\u ip”]#元字段
字段.扩展(survey.formfields)#调查特定字段
randname=”“.join(random.sample(string.letters+string.digits,15))+“.csv”#一些随机文件名
将open(“静态//”+randname,“wb”)作为csvf:
wr=csv.DictWriter(csvf,字段,编码='cp949')
wr.writerow(dict(zip(字段,字段)))#dummy,解释每列的含义
对于resp中的resp:
wr.writerow(resp)
从_目录返回send_(“static”,randname,as_attachment=True)

我想有文件被删除后,完成下载。我该怎么做呢?

在Linux上,如果您有一个打开的文件,即使被删除,您仍然可以读取它。这样做:

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')

csvf
文件创建后立即删除;一旦文件关闭,操作系统将回收空间(请求完成并删除对文件对象的最后引用后,cpython将立即为您回收空间)。(可选)您可以使用显式关闭文件对象。

我已经使用os.unlink一段时间并成功:

import os

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

希望对您有所帮助。

send\u from\u目录来自库或是您自己编写的?这是flask api提供的。前一段时间,这个功能给我们带来了困难。我们的邮件服务器正在取消文件链接,而没有关闭文件描述符。突然,系统报告
磁盘已满
,但
df
显示大量磁盘空间。小心使用-很难找到这样的错误。@bikeshedder:下次检查打开的文件描述符:-)这是一种很常见的模式。建议的编辑:注意
附件文件名
参数用于
发送文件();它提供要使用的文件名,而不是临时文件。这里绝对不需要使用名为“
的临时文件”
。@Martijn Pieters下次如何检查打开的文件描述符?文件“
是多余的;如果
file
不是字符串,则最多使用
str(file)
import os

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