我需要從一個字符串創建一個文件,因此我可以將它用作Django中電子郵件的附件。一些谷歌搜索後,我發現臨時文件tempfile模塊,但它不工作,如我所料。Python:TemporaryFile在讀取時返回空字符串
以下代碼返回一個空字符串。
>>> f = tempfile.TemporaryFile()
>>> f.write('foobar')
>>> f.read()
''
我需要從一個字符串創建一個文件,因此我可以將它用作Django中電子郵件的附件。一些谷歌搜索後,我發現臨時文件tempfile模塊,但它不工作,如我所料。Python:TemporaryFile在讀取時返回空字符串
以下代碼返回一個空字符串。
>>> f = tempfile.TemporaryFile()
>>> f.write('foobar')
>>> f.read()
''
當您調用read時,它正試圖從文件末尾的位置讀取數據。你在閱讀它之前跳轉到文件的開頭:
如果您需要重新寫,你應該跳到結尾寫,如果你不希望覆蓋你的東西之前:
f.seek(0, os.SEEK_END)
f.write('some stuff')
試着做一個f.seek(0)
回退到寫入和讀取之間的開始。一個read()
調用通常會在您剛剛編寫的數據的端上留下「文件指針」(這是一種操作系統的食指,指向記住當前文件中的哪個位置)。
哎呀,看起來我的答案太慢了:P – Spike 2011-03-26 19:46:25
另一方面,在寫完之前,你已經詳細瞭解瞭如何移動到最後,儘管這不是問題的一部分,提問者知道! – 2011-03-26 19:50:33
如果您的內存中已有字符串,則可以使用StringIO或cStringIO模擬字符串上的文件。這應該會更快,因爲根本不會有磁盤操作。
偉大的問題,因爲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