【问题标题】:Best way to Create a CSV, Compress it and Attatch with Email创建 CSV、压缩和附加电子邮件的最佳方式
【发布时间】:2014-09-01 21:42:20
【问题描述】:

我有一个问题,我正在寻找执行以下任务的最佳方法。

  • 创建内存中的 csv 文件
  • 压缩它(Gizip 或 Zip)
  • 随电子邮件附上

我很难找到我正在寻找的确切解决方案。

这是我的代码。

代码

prospects = Customer.objects.filter(state_id=2)
csvfile = StringIO.StringIO()
writer = UnicodeWriter(csvfile, encoding='utf-8')
writer.writerow(["Name", "Email"])
for prospect in prospects:
    writer.writerow(
        [prospect.name, prospect.email]
    )
csvobj = csvfile.getvalue() # not sure about it. 

代码第 2 部分

g = gzip.GzipFile(fileobj=csvobj)
g.close()

代码第 3 部分

  msg = EmailMultiAlternatives(
            subject="Innovation",
            body="text_context",
            from_email=settings.DEFAULT_FROM_EMAIL,
            to=["bac@gmail.com"]
        )
  msg.attach("z.gzip",g, 'application/zip')
  msg.send(True)

错误

TypeError: 'GzipFile' object does not support indexing

【问题讨论】:

    标签: python django email csv


    【解决方案1】:

    这就是我的做法。

    import StringIO
    import tablib
    
    headers = ["name", "Email"]
    values = Customer.objects.filter(state_id=2).values_list(‘name’, ‘email’)
    data = tablib.Dataset(*values, headers=headers)
    
    csvfile = StringIO.StringIO()
    csvfile.write(data.csv)
    
    gzipped = gzip.GzipFile(mode='wb', fileobj=csvfile.getvalue())
    gzipped.close()
    
    # msg stuff...
    msg.attach("z.gzip", gzipped, 'application/zip')
    

    对我来说效果很好,如果你尝试一下,你仍然会收到错误吗?

    【讨论】:

    • 小优化将使用cStringIO 而不是StringIO
    • @Blackeagle52:除非你想支持 unicode 字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多