Python面向对象编程指南(第9章)序列化和保存-JSON、YAML,PickleCSV和XML
把这本压箱底的书拿出来看了下,感觉还不错,就给自己记录一下。
JSON,YAML,Pickle,XML和CSV比较适合用于数据交换,主要应用于单一对象而非多个对象的场景。
Shelve支持多个对象的持久化
为了存储Python中的对象,必须先将其转换为字节,然后再将字节写入文件,这个过程成为序列化,又要数据转化,压缩,编码。
这是一本好书,超级烂的翻译,很多文字描述语句都读不通。
9.3定义用于持久化的类。
书中定义了类,通过jinja2来渲染实例。
代码写的绝对使高手,jinja的用法快忘了。
import datetime from collections import defaultdict class Post: def __init__(self, date, title, rst_text, tags): self.date = date self.title = title self.rst_text = rst_text self.tags = tags def as_dict(self): return dict( date=str(self.date), title=self.title, underline="_" * len(self.title), res_test = self.rst_text, tag_text = " ".join(self.tags) ) class Blog: def __init__(self, title, posts=None): self.title = title self.entries = posts if posts is not None else [] def append(self, post): self.entries.append(post) def by_tag(self): tag_index = defaultdict() for post in self.entries: for tag in post.tags: tag_index[tag].addend(post.as_dict()) return tag_index def as_dict(self): return dict( title = self.title, underline = '='*len(self.title), entries = [p.as_dict() for p in self.entries] ) travel = Blog("Travel") # 添加两条信息 travel.append( Post(date=datetime.datetime(2014, 11, 14, 17, 25), title="Hard Aground", rst_text="""Some embarrassing revelation. Including and cyr""", tags=("#RedRanger", "#Whiby42", "#ICW") ) ) travel.append( Post(date=datetime.datetime(2014, 11, 14, 17, 25), title="Hard Aground", rst_text="""Some embarrassing revelation. Including and cyr""", tags=("#RedRanger", "#Whiby42", "#ICW"), ) ) travel.append( Post(date=datetime.datetime(2014, 11, 18, 15, 30), title="Anchor Follies", rst_text="""Some witty epigram.Including < & > character.""", tags=("#RedRanger", "#Whiby42", "#Mistakes"), ) )
这是后续需要序列化的对象travel,书中后面首先用这个对象的一些方法进行了Jinja2模块的渲染执行,我不写了,抄这个代码让我想睡觉。
9.4使用JSON进行转储和加载
我的理解JSON就是一种理想的数据交换语言。
Python中json支持的类型与对应JSON的关系
dict: object
list,tuple: array
str: string
int, float: number
True: true
Flase: Flase
None: null
import json from t9_3 import travel print(json.dumps(travel.as_dict(), indent=4))
序列化输出,效果不打了。
我们将Python对象重写为字典,应该提供一种更好的装换方式,不必额外地创建字典(上面用了as_dict方法)
不写了,这书中代码错误太多,截取代码也有问题,中文翻译更是垃圾,有空的时候当工具书看看就算了。