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方法)

 

 

不写了,这书中代码错误太多,截取代码也有问题,中文翻译更是垃圾,有空的时候当工具书看看就算了。

posted @ 2020-02-20 22:29  就是想学习  阅读(317)  评论(0编辑  收藏  举报