如何生成文件而不将其保存到python中的磁盘?

时间:2015-09-17 15:40:06

标签: python django csv

我正在使用Python 2.7和Django 1.7。

我的管理界面中有一个生成某种csv文件的方法。

def generate_csv(args):
    ...
    #some code that generates a dictionary to be written as csv
    ....

    # this creates a directory and returns its filepath
    dirname = create_csv_dir('stock')

    csvpath = os.path.join(dirname, 'mycsv_file.csv')
    fieldnames = [#some field names]

    # this function creates the csv file in the directory shown by the csvpath
    newcsv(data, csvheader, csvpath, fieldnames)

    # this automatically starts a download from that directory
    return HttpResponseRedirect('/media/csv/stock/%s' % csvfile)

总而言之,我创建了一个csv文件,将其保存在磁盘上的某个位置,然后将其URL传递给用户进行下载。

我在考虑是否可以在不写入光盘的情况下完成所有这些操作。我google了一下,也许内容处理附件可能对我有帮助,但我在文档中迷失了一点。

无论如何,如果有更简单的方法,我很乐意知道。

2 个答案:

答案 0 :(得分:4)

感谢@Ragora,你指引我走向正确的方向。

我重写了newcsv方法:

def newcsv(data, csvheader, fieldnames):
    """
    Create a new csv file that represents generated data.
    """
    csvrow = []
    new_csvfile = StringIO.StringIO()
    wr = csv.writer(new_csvfile, quoting=csv.QUOTE_ALL)
    wr.writerow(csvheader)
    wr = csv.DictWriter(new_csvfile, fieldnames = fieldnames)

    for key in data.keys():
        wr.writerow(data[key])

    return new_csvfile

并在管理员中:

csvfile = newcsv(data, csvheader, fieldnames)

response = HttpResponse(csvfile.getvalue(), content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=stock.csv'
return response

答案 1 :(得分:-2)

如果您将文件保存到磁盘会让您烦恼,只需将application / octet-stream内容类型添加到Content-Disposition标头,然后从磁盘中删除该文件。

  

如果在具有application / octet-stream内容类型的响应中使用此标头(Content-Disposition),则隐含的建议是用户代理不应显示响应,而是直接输入`save response as。 ..'对话框。