class CSVDownload(View):
""" Prepares CSV file version to download """
#more code here
f = StringIO.StringIO()
writer = csv.writer(f, dialect='excel')
for v in visit_list:
writer.writerow([v.idfa.idfa, v.name, v.duration, v.firstSeen, v.lastSeen, v.identifier, v.closestProximity])
f.seek(0)
response = HttpResponse(f, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=AdvertiserData.csv'
return response由于某些原因,当在excel中打开文件时,该文件将只输出列表中的最后一项,请参见

这使我相信每一行都在覆盖第一行。尽管情况不应该是这样。看看我在终端机预先准备的这些测试。
>>> f.getvalue()
'FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,PPTest1,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR\r\nFFAC6F6C-1B2E-47C2-8110-5E619B239FB1,moo2,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR\r\n'这将返回多个值,其中\r\n在两个值之间。
还有,我试过
>>> print response
Content-Type: text/csv
Content-Disposition: attachment; filename=boo.csv
FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,PPTest1,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR
FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,moo2,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR这也显示了一个以上的价值。
我最近看到了一个这样的线程,它讨论了在这里添加一个文件:How do you append to a file?,但是由于我只在内存中创建这个项(使用stringIO),我如何才能获得相同的效果?
谢谢!
编辑以获取额外信息:
访问模型的visit_list被破坏了:
class Visit(models.Model):
idfa = models.ForeignKey(Report)
name = models.CharField(max_length=255)
lastSeen = models.CharField(max_length=255)
duration = models.CharField(max_length=255)
firstSeen = models.CharField(max_length=255)
identifier = models.CharField(max_length=255)
closestProximity = models.CharField(max_length=255)
def __unicode__(self):
return self.name
class Meta:
verbose_name = "Visit"
verbose_name_plural = "Visits"在这种情况下,visit_list返回:
>>> visit_list
[<Visit: PPTest1>, <Visit: moo2>]发布于 2014-11-26 04:39:17
的底线:我怀疑您需要将f.getvalue()传递给HttpResponse而不是f。
解释
prefers strings,尽管它也可以被视为文件对象或接受迭代器。然而,f是一个StringIO.StringIO实例,而不是字符串本身。
考虑以下设置:
import StringIO
import csv
>>> f = StringIO.StringIO()
>>> writer = csv.writer(f, dialect='excel')
>>> row = range(4) # first row is [0, 1, 2, 3]
>>> for i in range(5):
writer.writerow([row]) # write more rows
row = [x + 1 for x in row]
>>> f.seek(0)现在将f与f.getvalue()的结果进行比较
# an instance
>>> f
<StringIO.StringIO instance at 0x03656990>
# a string
>>> f.getvalue()
'"[0, 1, 2, 3]"\r\n"[1, 2, 3, 4]"\r\n"[2, 3, 4, 5]"\r\n"[3, 4, 5, 6]"\r\n"[4, 5, 6, 7]"\r\n'现在,请注意当您将实例与字符串传递给response时,您的HttpResponse对象中的差异。
# The instance
>>> response = HttpResponse(f, content_type='text/csv') # f is an instance
>>> response['Content-Disposition'] = 'attachment; filename=AdvertiserData.csv'
>>> response._container
['']
# The string
>>> response = HttpResponse(f.getvalue(), content_type='text/csv') # f.getvalue() returns a string
>>> response['Content-Disposition'] = 'attachment; filename=AdvertiserData.csv'
>>> response._container
['"[0, 1, 2, 3]"\r\n"[1, 2, 3, 4]"\r\n"[2, 3, 4, 5]"\r\n"[3, 4, 5, 6]"\r\n"[4, 5 , 6, 7]"\r\n']注意,当您将实例传递给HttpResponse时,响应的f.getvalue()属性是空的,但是当您将f.getvalue()字符串传递给HttpResponse时,不是空的。
我会试一试,然后:
>>> response = HttpResponse(f.getvalue(), content_type='text/csv')
>>> # etc.https://stackoverflow.com/questions/27139500
复制相似问题