Python学习 Day 022 - 常用模块02

主要内容

  • 1. 什么是序列化
  • 2. pickle(重点)
  • 3. shelve
  • 4. json(重点)
  • 5. configparser模块

1.序列化的概念

    序列化:在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个过程叫序列化

    不同的序列化, 结果也不同,但目的是一样的. 都是为了存储和传输.       

 在python中存在三种序列化的方案.           

  • pickle: 可以将我们python中的任意数据类型转化成bytes并写入到文件中,同样也可以把文件中写好的bytes转换回我们python的数据,这个过程被称为反序列化         
  • shelve:  另类的一种序列化的方案. 有点儿类似后面我们学到的redis,可以作为 一种小型的数据库来使用         
  • json:   将python中常见的字典, 列表转化成字符串,是目前后端数据交互使用频率最高的一种数据格式

2. pickle(重点)

 pickle 就是把我们的python对象写入到文件中的一种解决方案. 但是写入到文件的是bytes. 所以这东西不是给人看的,是给机器看的.

import pickle
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def catchMouse(self):
        print(self.name, self.age, "抓老鼠")

c = Cat("jerry",18)
bs = pickle.dumps(c)       #序列化一个对象
print(bs)                  #一堆二进制,看不懂

cc = pickle.loads(bs)     # 把二进制的反序列转化成我们的对象
cc.catchMouse()           # 猫的功能可以执行

在pickle中的dumps可以序列化一个对象,loads可以反序列化一个对象

# c = Cat("jerry",18)
# f = open ("pickle1",mode="wb")
# pickle.dump(c,f)              #结果人是无法查看的
# f.close()

f = open("pickle1",mode = "rb")
c = pickle.load(f)
print(c)                 #此时c是一个可执行对象
c.catchMouse()
# lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 8), Cat("猫4", 7), Cat("猫5", 6)]
# f = open("pickle1",mode = "wb")
# for el in lst:
#     pickle.dump(el, f)
# f.flush()
# f.close()

f = open("pickle1",mode= "rb")
while 1:
    try:
        c = pickle.load(f)
        c.catchMouse()
    except EOFError:
        break

在pickle中我们使用 dump 进行序列化,将对象转化成bytes并写入文件, load是反序列化,把文件中的bytes进行读取,转化成对象

 但是这样写并不够好,因为读的时候,并不能知道有多少对象要读.这里记住, 不能一行一行的读. 那真的要写入或者读取多个内容怎么办? 很简单. 装list里. 然后读取和写入都用list 

# lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 8), Cat("猫4", 7), Cat("猫5", 6)]
# f = open("pickle1",mode = "wb")
# pickle.dump(lst, f)
# f.flush()
# f.close()

f = open("pickle1",mode= "rb")
while 1:
    try:
        lst = pickle.load(f)
        for el in lst :
            el.catchMouse()
    except EOFError:
        break

3. shelve

shelve提供python的持久化操作. 持久化操作:就是把数据写到硬盘上,在操作shelve的时候非常的像操作一个字典,这个东西到后期,就像redis差不多

import shelve

f = shelve.open("sylar")      #打开一个文件
f['Ljj'] = "林俊杰"
f['Jay'] = "周杰伦"
f['zzr'] = "周芷若"           #像操作字典一样操作文件
print(f['Jay']) 
print(f["Ljj"])
f.close()
# f = shelve.open("sylar")
# f["Jay"] = {"name":"周杰伦","age":"19","hobby":"唱歌"}
# print(f["Jay"])
# f.close()

# f = shelve.open("sylar")
# f["Jay"]["name"] = "肉夹馍"
# f.close()
#
# f = shelve.open("sylar")
# print(f["Jay"])
# f.close()              #{'name': '周杰伦', 'age': '19', 'hobby': '唱歌'}  发现此时想要改变的值并未发生改变

#解决方案
f = shelve.open("sylar",writeback= True)
f["Jay"]["name"] = "肉夹馍"
f.close()

f = shelve.open("sylar")
print(f["Jay"])
f.close()                    #{'name': '肉夹馍', 'age': '19', 'hobby': '唱歌'}此时值发生改变

*** writeback=True可以动态的把我们修改的信息写入到文件中. 而且还可以删除数据,就像字典一样

# f = shelve.open("sylar",writeback=True)
# del f["Jay"]
# f.close()
#
# f = shelve.open("sylar")
# print(f["Jay"])       #报错,.没有了
# f.close()

# f = shelve.open("sylar", writeback=True)
# f['jay'] = "周杰伦"
# f['wlj'] = "王力宏"
# f.close()

# f = shelve.open("sylar")
# for k,v in f.items():
#     print(k,v)

4. json(重点)

 json是我们前后端交互的枢纽(前后端通用的书库格式),相当于编程界的普通话

 json的语法格式可以完美的表示一个对象, json全 称javascript object notation. 翻译过来叫js对象简谱.

wf = {
    "name": "汪峰",
    "age": 18,
    "hobby": "抢头条",
    "wife": {
        "name": "子怡",
        "age": 19,
        "hobby":["唱歌", "跳舞", "演戏"]
    }
}

在python里这玩意叫字典. 但是在javascript里这东西叫json

我们的程序是在python里写的,但是前端是在JS那边来解析json的,

所以,我们需要把我们程序产生的字典 转化成 json格式的json串(字符串),然后通过网络传输,那边接收到了之后,再进行传输.

(1)需要将字典转化成json格式的字符串.

import json

dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"}
# s = json.dumps(dic)    # 把字典转化成json字符串
# print(s)   # {"a": "\u5c11\u6797\u8db3\u7403", "b": "\u5927\u8bdd\u897f\u6e38", "c": "\u529f\u592b", "d": "\u4e5d\u54c1\u829d\u9ebb\u5b98"}
# 如果你的key或者value超出了ascii范畴。 就会显示成\uxxxxx

s = json.dumps(dic,ensure_ascii=False)     # 干掉ascii码
print(s,type(s))    #{"a": "少林足球", "b": "大话西游", "c": "功夫", "d": "九品芝麻官"},<class 'str'>

(2)将前端传递过来的json字符串转化成字典

import json
#
dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"}
s = json.dumps(dic,ensure_ascii=False)     # 干掉ascii码
dic1 = json.loads(s)
print(dic1,type(dic1))    #'a': '少林足球', 'b': '大话西游', 'c': '功夫', 'd': '九品芝麻官'} <class 'dict'>

(3)json也可以像pickle一样把序列化的结果写入到文件中

import json
# 写入
# dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"}
# f = open("json1",mode ="w",encoding ="utf-8")
# json.dump(dic,f,ensure_ascii=False)    # 把json写入到文件中
# f.close()

#读出
f = open("json1",mode = "r",encoding = "utf-8")
s = json.load(f)             #把文件中的json串读成字典
print(s,type(s))                    #{'a': '少林足球', 'b': '大话西游', 'c': '功夫', 'd': '九品芝麻官'} <class 'dict'>
f.close()  

另外:当向同一个文件写入json串时

import json

# lst = [{"a": 1}, {"b": 2}, {"c": 3}]
# #写入
# f = open("json2",mode = "w",encoding = "UTF-8")
# for el in lst:
#     s = json.dumps(el,ensure_ascii=True) +"\n"  #此处如果 写成json.dump(el, f, ensure_ascii=False)就写成了一行,读取时并不能够读出来
#     f.write(s)
# f.close()

#读取
f = open("json2",mode= "r",encoding ="utf-8")
for line  in f :
    dic = json.loads(line.strip())
    print(dic)
f.close()

 写入

  •  循环
  •  用dumps把字典转化成字符串, 然后手工在后面加一个\n
  •  写入 f.write()

 读取

  • for line in f:
  • strip()去掉空白
  • loads()变成字典

5. configparser模块

 该模块适用于配置文件的格式与windows ini文件类,可以包含一个或多个节(section)每个节可以有多个参数(键=值)

[DEFAULT]
session-time-out = 30
user-alive = 60
connect-alive = 10

[189-DB]
ip = 189.135.63.12
port = 3306
uname = root
password = root

[166-DB]
ip = 189.135.63.12
port = 3306
uname = root
password = root

[163-DB]
ip = 189.135.63.12
port = 3306
uname = alex
password = root
wangermazi = 189

[jay]
import configparser

# conf = configparser.ConfigParser()
# conf["DEFAULT"] = {
#     "session-time-out":30,
#     "user-alive": 60,
#     "connect-alive":10
# }
# conf["189-DB"] = {
#     "ip": "189.135.63.12",
#     "port": 3306,
#     "uname": "root",
#     "password": "root"
# }
# conf["166-DB"] = {
#     "ip": "189.135.63.12",
#     "port": 3306,
#     "uname": "root",
#     "password": "root"
# }
# conf["163-DB"] = {
#     "ip": "189.135.63.12",
#     "port": 3306,
#     "uname": "root",
#     "password": "root"
# }
#
# f = open("db.ini", mode="w")
# conf.write(f) # 把文件扔进去。 写到这个文件里

#读取
# conf = configparser.ConfigParser()
# conf.read("db.ini")     #读取文件
# print(conf.sections())   # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
# print(conf.get("DEFAULT","SESSION-TIME-OUT"))   #从xxx章节中读取到xxx信息
#
# #可以像字典一样操作
# print(conf['166-DB']["ip"])
# print(conf["166-DB"]["port"])
# print(conf["166-DB"]["uname"])
# print(conf["166-DB"]["password"])
#
# for k,v in conf["166-DB"].items():
#     print(k,v)

#增删改操作
conf = configparser.ConfigParser()
conf.read("db.ini")         #读取出来
conf['163-DB']['uname'] = "alex"
# del conf['163-DB']["password"]
conf.set("163-DB", "wangermazi", "189")
conf.add_section("jay")
conf.write(open("db.ini", mode="w"))

猜你喜欢

转载自www.cnblogs.com/wcx666/p/9762251.html
022