• django框架学习:三十四.动态生成CSV文件


    前言

    CSV以纯文本形式存储数字和文本数据的存储方式,纯文本意味着改文件是一个字符序列,不含必须像二进制数字那样的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其他字符或者字符串,最常见的是逗号或制表符,通常,所有记录都有完全相同的字段序列。

    要在django视图中生成CSV文件,可以使用Python的CSV库或者django的模版系统来实现。

    一.使用python的CSV库

    python自带处理CSV文件的标准库csv。csv模块的csv文件创建功能类似于文件对象创建,并且django的HttpResponse对象也是类似于文件的对象。

    实例:

    from django.http import HttpResponseRedirect,HttpResponse
    import csv

    def some_view(request):
    response=HttpResponse(content_type="text/csv")
    response["Content-Disposition"]="attachment; filename='somefilename.csv'"
    writer = csv.writer(response)
    writer.writerow(['Frist row','Foo','Bar','Baz'])
    writer.writerow(['second row','A','B','C','Testing'])
    return response

     相关说明:

    相应对象的MIME类型设置为text/csv,告诉浏览器返回的是一个CSV文件。

    相应对象设置里附加的Content-Disposition协议头,含有CSV文件文件的名称,文件名随便取,浏览器会在“另存为...”对话框等环境中使用它。

    要在生成CSV的API中使用钩子非常简单:只需要把response作为第一个参数传递给csv.writer。csv.writer方法接收一个类似于文件的对象,而HttpResponse对象正好就是这么个东西。

    对于csv的每一行,调用writer.writerrow,向他传递一个可迭代的对象比如列表或者元祖。

    csv模板会为你处理各种引用,不用担心没有转义字符串中的引号或者逗号。只需要向writerow()传递你的原始字符串,它就会执行正确的操作。

    当处理大尺寸文件时,可以使用django的StreamHttpResponse类,通过流式传输,避免负载均衡器在服务器生成响应的时候断掉连接,提高传输可靠性。

    在下面的例子中,利用python的生成器来有效处理发尺寸CSV文件的拼接和传输:

    import csv
    from django.http import StreamingHttpResponse

    class Echo(object):
    def write(selfself,value):
    return value
    def some_streaming_csv_view(request):
    rows = (["Row {}".format(idx),str(idx)] for idx in range(65536))
    '''伪缓存'''
    pseudo_buffer = Echo()
    writer = csv.writer(pseudo_buffer)
    response = StreamingHttpResponse((writer.writerow(row)for row in rows),content_type="text/csv")
    response["Content-Disposition"]="attachment; filename='somefilename.csv'"
    return response
  • 相关阅读:
    20210312
    20210311
    20210310
    例5-1
    例5-2
    例4-12-2
    例4-12
    例4-11
    例4-10
    例4-9
  • 原文地址:https://www.cnblogs.com/liushui0306/p/12883371.html
Copyright © 2020-2023  润新知