承接上文 pickle和cPickle:Python对象的序列化(上) 。
当与你自己的类一起工作时,你必须保证类被腌渍出现在读取pickle的进程的命名空间中。只有该实例的数据而不是类定义被腌渍。类名被用于在反腌渍时,找到构造器(constructor)以创建新对象。以此——往一个文件写入一个类的实例为例:
| 1234567891011121314151617181920212223242526272829303132333435 | try: import cPickle as pickleexcept: import pickleimport sys class SimpleObject(object): def __init__(self, name): self.name = name l = list(name) l.reverse() self.name_backwards = \’\’.join(l) return if __name__ == \’__main__\’: data = [] data.append(SimpleObject(\’pickle\’)) data.append(SimpleObject(\’cPickle\’)) data.append(SimpleObject(\’last\’)) try: filename = sys.argv[1] except IndexError: raise RuntimeError(\’Please specify a filename as an argument to %s\’ % sys.argv[0]) out_s = open(filename, \’wb\’) try: # 写入流中 for o in data: print \’WRITING: %s (%s)\’ % (o.name, o.name_backwards) pickle.dump(o, out_s) finally: out_s.close() |
在运行时,该脚本创建一个以在命令行指定的参数为名的文件:
| 123456 | $ python pickle_dump_to_file_1.py test.dat WRITING: pickle (elkcip)WRITING: cPickle (elkciPc)WRITING: last (tsal) |
一个在读取结果腌渍对象失败的简化尝试:
| 123456789101112131415161718192021222324252627 | try: import cPickle as pickleexcept: import pickleimport pprintfrom StringIO import StringIOimport sys try: filename = sys.argv[1]except IndexError: raise RuntimeError(\’Please specify a filename as an argument to %s\’ % sys.argv[0]) in_s = open(filename, \’rb\’)try: # 读取数据 while True: try: o = pickle.load(in_s) except EOFError: break else: print \’READ: %s (%s)\’ % (o.name, o.name_backwards)finally: in_s.close() |
该版本失败的原因在于没有 SimpleObject 类可用:
上一篇:python进程、线程、协程
下一篇:学习Python的三种境界