2014-04-26 24 views
0

問題是,我從一個來源提取數據,我想將它保存到保存箱中作爲一個pickle文件。我無法將其保存在目錄中,因爲我正在服務器上運行代碼(iron.io)。如何將列表保存到臨時目錄中的pickle文件並將該文件傳遞給函數?

import tempfile 
import pickle 


def SFDCDropboxSync(Data): 
    f = tempfile.NamedTemporaryFile(delete=False) 
    pickle.dump(Data,open(f,'wb')) 

    client = dropbox.client.DropboxClient(access_token) 
    client.put_file(filename, f) 

這是我的錯誤:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 38, in <module> 
    if __name__ == "__main__": main() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 31, in main 
    print SFDCDropboxUploadDownload().SFDCDropboxSync(lst) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 26, in SFDCDropboxSync 
    pkl = self.SaveListtoPickle(lst) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py", line 20, in SaveListtoPickle 
    pickle.dump(lst,open(f,'wb')) TypeError: coercing to Unicode: need string or buffer, instance found [Finished in 0.7s with exit code 1] [shell_cmd: python -u "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump/SFDCDropboxUpload.py"] [dir: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Shippy/RecurringDataDump] [path: /usr/bin:/bin:/usr/sbin:/sbin] 
+0

你試圖轉儲沒有'b'標誌? 'pickle.dump(lst,open(f,'w'))' – inspectorG4dget

+0

是的,同樣的錯誤 – Chris

+0

程序和跟蹤不匹配...但它看起來像Data(或lst?)不是可選對象。那麼,你在傳遞什麼? – tdelaney

回答

2

在你的代碼中,NamedTemporaryFile f不是一個字符串。它是一個文件對象,與open(file_path)的輸出類似。

documentation:這個類文件對象可以在with語句中使用,就像普通文件一樣。

如果你想路徑創建的文件,使用tmp_file.name

例如,這個工程:(Python的3.6.2測試)

def SFDCDropboxSync(Data): 
    with tempfile.NamedTemporaryFile() as tmp_file: 
     pickle.dump(Data, tmp_file) 
     tmp_file.flush() 

     print(pickle.load(open(tmp_file.name, 'rb'))) 

這將刪除文件時,它退出while(文件關閉)。

對Windows的警告:在打開文件時可能會遇到問題。相反,使用類似的東西:

with tempfile.NamedTemporaryFile(delete=False) as tmp_file: 
    pickle.dump(Data, open(tmp_file.name, 'wb')) 
    tmp_filename = tmp_file.name 

pickle.load(open(tmp_filename, 'rb')) 
os.remove(tmp_filename) 
+0

使用file.seek(0),你可以使用一個普通的臨時文件,它比我重新打開文件更快 – Buddhi741

相關問題