如何在Python中完整保存/读取类

27
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()
或者
som = SOM_CLASS()
save(som)
#...
load(som)
som.work()

最简单的方法是什么?


有其他要求吗?速度/大小/安全性/可移植性?http://docs.python.org/library/json.html 可以是一个选项。 - Esteban Küber
要求:易于快速完成此任务并完成其他工作。 - Mike
你应该将其改为“如何在Python中完整保存/读取对象”。 - Nicolas Shu
4个回答

31

你可以使用pickle进行序列化和反序列化。它是向后兼容的,即在未来版本中将支持所有旧协议。

import pickle

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

请注意,如果您将腌制的对象转移到另一台计算机,请确保连接不会被篡改,因为pickle可能是不安全的(这是每个pickle用户都应该知道的文章)。

另一个选择是较旧的模块marshal


Nadia...即使离线也会回答问题 :) http://stackoverflow.com/users/97828/nadia-alramli - Esteban Küber

14

我使用这段代码:

import cPickle
import traceback

class someClass():
    def __init__(self):
        #set name from variable name. https://dev59.com/23I-5IYBdhLWcg3wwbVL
        (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/


太棒了!正是我想要的。 - markroxor
太棒了,我真希望能像这样想到这个点子! :) - Jim Jam

2

看一下Python的pickle库。


1
使用pickle的方式如下:

在此使用pickle

import pickle
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade # 0 - 100
    def get_grade(self):
        print (self.grade)
s1 = Student("Tim", 19, 95)

#save it
with open(f'test.pickle', 'wb') as file:
    pickle.dump(s1, file) 

#load it
with open(f'test.pickle', 'rb') as file2:
    s1_new = pickle.load(file2)

#check it
s1_new.get_grade()
# it prints 95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接