2011-03-26 22 views
3

我需要從一個字符串創建一個文件,因此我可以將它用作Django中電子郵件的附件。一些谷歌搜索後,我發現臨時文件tempfile模塊,但它不工作,如我所料。Python:TemporaryFile在讀取時返回空字符串

以下代碼返回一個空字符串。

>>> f = tempfile.TemporaryFile() 
>>> f.write('foobar') 
>>> f.read() 
'' 
+0

偉大的問題,因爲Django文檔沒有提到這個:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/?from=olddocs#handling-uploaded-files。如果首先使用chunks()方法,那麼在完成時它不會調用seek(0),導致將來的調用read()失敗。 – 2011-05-21 17:48:30

回答

6

當您調用read時,它正試圖從文件末尾的位置讀取數據。你在閱讀它之前跳轉到文件的開頭:

如果您需要重新寫,你應該跳到結尾寫,如果你不希望覆蓋你的東西之前:

f.seek(0, os.SEEK_END) 
f.write('some stuff') 
1

試着做一個f.seek(0)回退到寫入和讀取之間的開始。一個read()調用通常會在您剛剛編寫的數據的上留下「文件指針」(這是一種操作系統的食指,指向記住當前文件中的哪個位置)。

+0

哎呀,看起來我的答案太慢了:P – Spike 2011-03-26 19:46:25

+0

另一方面,在寫完之前,你已經詳細瞭解瞭如何移動到最後,儘管這不是問題的一部分,提問者知道! – 2011-03-26 19:50:33

1

如果您的內存中已有字符串,則可以使用StringIO或cStringIO模擬字符串上的文件。這應該會更快,因爲根本不會有磁盤操作。