2010-02-26 63 views
6
som = SOM_CLASS() # includes many big difficult data structures 
som.hard_work() 
som.save_to_disk(filename) 
#then later or another program 
som = SOM_CLASS() 
som.read_from_file(filename) 
som.do_anythink_else() 

如何保存/讀取類全在Python

som = SOM_CLASS() 
save(som) 
#... 
load(som) 
som.work() 

是什麼做到這一點最簡單的方法?

+0

其他要求?速度/大小/安全性/便攜性? http://docs.python.org/library/json.html可能是一個選項。 – voyager 2010-02-26 22:07:02

+0

需求=容易和快速做到這一點做另一項工作) – Mike 2010-02-26 22:13:45

回答

9

你可以用(de)序列化爲pickle。它是向後兼容的,即它將支持未來版本中的所有舊協議。

import pickle 

som = SOM_CLASS() 
fileObject = <any file-like object> 
pickle.dump(som, fileObject) 
#... 
som = pickle.load(fileObject) 
som.work() 

但是記住,如果醃製對象轉移到另一臺計算機,確保連接不能作爲pickle might be unsecure(這是每一個用戶泡菜應該知道的文章)被篡改。

另一種選擇是舊模塊marshal

+0

納迪亞...即使在離線時也能回答:) http://stackoverflow.com/users/97828/nadia-alramli – voyager 2010-02-26 22:16:05

0

我用這個代碼:

import cPickle 
import traceback 

class someClass(): 
    def __init__(self): 
     #set name from variable name. http://stackoverflow.com/questions/1690400/getting-an-instance-name-inside-class-init 
     (filename,line_number,function_name,text)=traceback.extract_stack()[-2] 
     def_name = text[:text.find('=')].strip() 
     self.name = def_name 

     try: 
      self.load() 
     except: 
      ############## 
      #to demonstrate 
      self.someAttribute = 'bla' 
      self.someAttribute2 = ['more'] 
      ############## 

      self.save() 

    def save(self): 
     """save class as self.name.txt""" 
     file = open(self.name+'.txt','w') 
     file.write(cPickle.dumps(self.__dict__)) 
     file.close() 

    def load(self): 
     """try load self.name.txt""" 
     file = open(self.name+'.txt','r') 
     dataPickle = file.read() 
     file.close() 

     self.__dict__ = cPickle.loads(dataPickle) 

這段代碼保存並從其實際的類實例名加載類。代碼來自我的博客http://www.schurpf.com/python-save-a-class/