2012-09-01 64 views
4

是否可以使用csv.writer将数据写入变量而不是文件?Python csv.writer - 是否可以写入变量?

我希望我可以做这样的事情:

data = '' 
csv.writer(data) 
# ...... (I have removed the csv processing code for brevity) 
message = EmailMessage('Invoice for 2012', 'h', '[email protected]', ['[email protected]']) 
message.attach('invoice.csv', data, 'text/csv') 
message.send() 

当我执行的代码,我收到以下错误:

argument 1 must have a "write" method 
+2

你需要给我们完整的回溯;这会给我们一个更好的想法,导致异常。 –

+0

此外,被删除的csv处理代码看起来像可能是导致问题的原因 –

回答

9

csv.writer类需要一个类似文件的对象,东西采用.write()方法。一个StringIO class将是最好的位置:

from cStringIO import StringIO 

data = StringIO() 
csv.writer(data) 
# write your stuff 
message = EmailMessage('Invoice for 2012', 'h', '[email protected]', ['[email protected]']) 
message.attach('invoice.csv', data.getvalue(), 'text/csv') 
message.send() 

我用StringIO模块存在的C-变体;优点是速度,缺点是您可以将每个实例仅用作可写文件。因为你所做的只是在取回写入的数据之前写入它,这很好。

+0

正是我之后所做的,非常感谢! –

4

无论何时您需要类似文件的对象(使用write方法)并且不想在文件系统中创建实际文件时,始终可以使用StringIO

这种内存文件方法的一个优点是I/O比使用实际存储后端快得多。如果你想更快,你可以使用cStringIO。请注意,cStringIO不总是可用的,所以你可以做一些像

try: 
    import cStringIO as StringIO 
except ImportError: 
    import StringIO