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

Posted

技术标签:

【中文标题】如何在python中生成文件而不将其保存到磁盘?【英文标题】:How to generate a file without saving it to disk in python? 【发布时间】:2015-12-14 13:44:19 【问题描述】:

我正在使用 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 传递给用户以供下载。

我在想如果所有这些都可以在不写入磁盘的情况下完成。我搜索了一下,也许内容处置附件可能对我有帮助,但我有点迷失在文档中。

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

【问题讨论】:

查看StringIO 看起来这与这里的问题非常相似,因为它几乎相同,只是负载不同:***.com/questions/908258/… 【参考方案1】:

感谢@Ragora,您为我指明了正确的方向。

我重写了newcsv方法:

from io import StringIO
import csv


def newcsv(data, csvheader, fieldnames):
    """
    Create a new csv file that represents generated data.
    """
    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

【讨论】:

谢谢,但是如何导入StringIO? This 没有帮助 试试 io.StringIO【参考方案2】:

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

如果此标头(Content-Disposition)用于具有 application/octet-stream 内容类型的响应中,则暗示用户代理不应显示响应,而是直接输入“将响应另存为”。 ..' 对话框。

【讨论】:

以上是关于如何在python中生成文件而不将其保存到磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

生成pdf而不将其保存到磁盘然后将其显示给浏览器

生成 MIDI 文件并播放它而不将其保存到磁盘

从 python 生成电影而不将单个帧保存到文件

将远程文件放入hadoop而不将其复制到本地磁盘

如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘

在内存中创建 eml 文件而不将其保存在磁盘上