对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑

Posted

技术标签:

【中文标题】对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑【英文标题】:Confused about making a CSV file into a ZIP file in django 【发布时间】:2009-09-10 04:57:22 【问题描述】:

我有一个视图,它从我的站点获取数据,然后将其制成一个 zip 压缩的 csv 文件。这是我的无 zip 工作代码:

def backup_to_csv(request):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=backup.csv'

    writer = csv.writer(response, dialect='excel')

    #code for writing csv file go here...

    return response

而且效果很好。现在我希望该文件在发送出去之前被压缩。这就是我卡住的地方。

def backup_to_csv(request):

    output = StringIO.StringIO() ## temp output file
    writer = csv.writer(output, dialect='excel')

    #code for writing csv file go here...

    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'

    z = zipfile.ZipFile(response,'w')   ## write zip to response
    z.writestr("filename.csv", output)  ## write csv file to zip

    return response

但事实并非如此,我不知道该怎么做。

【问题讨论】:

【参考方案1】:

好的,我明白了。这是我的新功能:

def backup_to_csv(request):

    output = StringIO.StringIO() ## temp output file
    writer = csv.writer(output, dialect='excel')

    #code for writing csv file go here...

    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'

    z = zipfile.ZipFile(response,'w')   ## write zip to response
    z.writestr("filename.csv", output.getvalue())  ## write csv file to zip

    return response

【讨论】:

是的,这会起作用(如果未压缩的输出很好地适合内存,否则考虑磁盘上的临时文件)。【参考方案2】:

请注意,在工作情况下,您如何 return response... 而在非工作情况下,您如何返回 z,这当然是不是HttpResponse(虽然它应该是!)。

所以:不要在response 上使用您的csv_writer,而是在临时文件上使用;压缩临时文件;并将 THAT 压缩字节流写入 response!

【讨论】:

好的,我更新了我的 OP 以反映我认为你在这里所说的内容。但我仍然缺少一些东西。我收到一个 AttributeError 说“StringIO 没有 len 方法”。我应该使用 StringIO 以外的其他东西将 csv 写入吗? 要提取 StringIO 实例的字符串值(这样你就可以得到它的len 等),一旦你写完它就使用thestringioinstance.getvalue()(在你关闭它之前!- )。【参考方案3】:
zipfile.ZipFile(response,'w') 

似乎在 python 2.7.9 中不起作用。 response 是一个 django.HttpResponse 对象(据说是类似文件的)但它给出了一个错误 "HttpResponse object没有属性'seek'。在python 2.7.0或2.7.6中运行相同的代码(我没有在其他版本中测试过)就可以了......所以你最好用 python 2.7.9 测试它,看看你是否得到相同的行为。

【讨论】:

以上是关于对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PIG 中将 XLSX 文件转换为 CSV 文件?

在 Python 中将 .dbf 批量转换为 .csv

在 Pentaho 中将批量 .xlsx 文件转换为 .csv (UTF-8)

在c#中将XML文件转换为csv文件格式

在PHP中将EXCEL文件转换为CSV文件[重复]

如何在 Python 中将多个 .txt 文件转换为 .csv 文件