2012-09-01 95 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