把这本压箱底的书拿出来看了下,感觉还不错,就给自己记录一下。
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方法)
不写了,这书中代码错误太多,截取代码也有问题,中文翻译更是垃圾,有空的时候当工具书看看就算了。