python摸爬滚打之day022----模块(序列化操作)

1、pickle

  可以将我们python中的任意数据类型转化成bytes并写入到文件中.  同样也可以把文件中写好的bytes转换回我们python的数据. 

   pickle可以直接序列化对象.

 1 class Fruit:
 2     def __init__(self,name,color):
 3         self.name = name
 4         self.color = color
 5 
 6     def eat(self):
 7         return "haochi"
 8 
 9 p1 = Fruit("apple1","red1")
10 p2 = Fruit("apple2","red4")
11 p3 = Fruit("apple3","red2")
12 p4 = Fruit("apple4","red6")
13 lst = [p1,p2,p3,p4]
14 
15 pickle.dump(lst,open("fruit_info","wb"))
16 
17 lst = pickle.load(open("fruit_info","rb"))
18 for i in lst:
19     print(i.name)
pickle序列化对象

2、shelve

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

 1 # shelve  数据的持久化操作, 像操作字典一样去操作shelve  -----------------------------------------------------------------
 2 d = shelve.open("shelve_file")
 3 d["wlh"] = "王力宏"
 4 d["ljj"] = {"name":"林俊杰","id":"singer"}
 5 d["zj"] = {"name":"张杰","wife":{"name":"谢娜","gender":"","worke":"大本营"}}
 6 d.close()
 7 
 8 
 9 d = shelve.open("shelve_file")
10 d.pop("zj")     # 能删除,但是再查询时会报错.
11 d.close()
12 
13 
14 d = shelve.open("shelve_file",writeback=True)     # 如果是嵌套字典的话, 必须得加上writeback回写参数, 不然没法修改
15 d["ljj"]["id"] = "歌手"
16 print(d["ljj"]["id"])
17 d.close()
shelve

3、configparser

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

 1 import configparser
 2 config = configparser.ConfigParser()
 3 config["DEFAULT"] = {                  # DEFAULT 是默认配置, 下面的一些子配置都会带上DEFAULT 里面的配置.
 4     "默认设置1":"...1",
 5     "默认设置2":"....2",
 6     "默认设置3":".....3",
 7 }
 8 config["配置11"] = {
 9     "设置11":"11",
10     "设置12":"12",
11     "设置13":"13",
12 }
13 config["配置22"] = {
14     "设置21":"21",
15     "设置22":"22",
16     "设置23":"23",
17 }
18 config["配置33"] = {
19     "设置31":"31",
20     "设置32":"32",
21     "设置33":"33",
22 }
23 
24 with open("peizhi.ini","w",encoding="utf8") as f:
25     config.write(f)         # 这里的write()方法是configparser自己重新写的,不是调用的文件操作的write()
26 
27 #
28 config = configparser.ConfigParser()
29 config.read("peizhi.ini",encoding="utf8")
30 print(config.sections())     # ['配置11', '配置22', '配置33']
31 print(config["配置33"]["设置33"])       # 33
32 
33 # 添加一个章节      先读取文件, 再修改, 最后写入文件
34 config = configparser.ConfigParser()
35 config.read("peizhi.ini",encoding="utf8")
36 config.add_section("配置44")
37 config["配置44"] = {
38     "设置41": "41",
39     "设置42": "42",
40     "设置43": "43",
41 }
42 config.write(open("peizhi.ini","w",encoding="utf8"))
43 
44 # 修改章节
45 config = configparser.ConfigParser()
46 config.read("peizhi.ini",encoding="utf8")
47 config.set("配置44","设置43","443")
48 config.write(open("peizhi.ini","w",encoding="utf8"))
49 
50 # 删除章节或  章节元素
51 config = configparser.ConfigParser()
52 config.read("peizhi.ini",encoding="utf8")
53 config.remove_section("配置44")         # 删除"配置44"章节
54 config.remove_option("配置44","设置43")    # 删除"配置44"里的"设置43"元素
55 config.write(open("peizhi.ini","w",encoding="utf8"))
56 
57 # 对config的所有修改操作都是先创建config对象,然后用config读取内容, 修改完之后再将config写进文件.
configparser

4、json

  json是所有语言都通用的模块

    4.1  json和pickle的比较?

1 dic = {1:"青铜",2:"白银",3:"黄金",4:"铂金",5:"钻石"}
2 
3 ret = json.dumps(dic,ensure_ascii=False)    # 用 ensure_ascii=False 来处理非中文显示
4 print(ret,type(ret))       # json结果是 str 类型
5 # ret = pickle.dumps(dic)
6 # print(ret,type(ret))      # pickle结果是 bytes 类型
View Code

  4.2  json写进文件

 1 dic = {'王力宏':{"ji":"新加坡","gender":"","album":"盖世英雄"},
 2        "林俊杰":"爱笑的眼睛",
 3        "张靓颖":{"gender":"","album":"如果这就是爱情"},
 4        "张杰":"云中的angle"
 5        }
 6 with open("singer_info.json","w",encoding="utf8") as f:
 7     json.dump(dic,f,ensure_ascii=False,indent=4)          # indent=4 即在json文件中改成好看点的格式
 8 # 即下面格式:
 9 # {
10 #     "王力宏": {
11 #         "ji": "新加坡",
12 #         "gender": "男",
13 #         "album": "盖世英雄"
14 #     },
15 #     "林俊杰": "爱笑的眼睛",
16 #     "张靓颖": {
17 #         "gender": "女",
18 #         "album": "如果这就是爱情"
19 #     },
20 #     "张杰": "云中的angle"
21 # }
json数据写进文件

  4.3  json也能处理对象, 也能将对象写进文件(通过间接方式将对象转成字典的形式,然后序列化字典写进文件)

 1 class Fruit:
 2     def __init__(self,name,color):
 3         self.name = name
 4         self.color = color
 5 
 6 
 7 
 8 
 9 def trans1(obj):
10     return {
11         "name": obj.name,
12         "color": obj.color,
13     }
14 # 用json序列化对象 ???
15 ap = Fruit("苹果","红色")
16 
17 # 方法一: __dict__  对obj的各种封装信息(也是字典)进行序列化
18 # ret = json.dumps(ap.__dict__, ensure_ascii=False)
19 # print(ret)
20 
21 # 方法二: 对函数返回的结果进行序列化
22 ret = json.dumps(ap,default=trans1,ensure_ascii=False)   # 把obj对象作为参数传进trans里,将返回的字典结果进行序列化
23 print(ret)
json序列化对象
 1 class Fruit:
 2     def __init__(self,name,color):
 3         self.name = name
 4         self.color = color
 5 
 6 
 7 def trans2(dic):
 8     print(type(dic))
 9     return Fruit(dic["name"],dic["color"])      # 返回自己构造的Fruit对象
10 
11 
12 # 用json反序列化
13 s = '{"name": "苹果", "color": "红色"}'
14 ap = json.loads(s,object_hook=trans2)     # 先将s进行反序列化, 然后将反序列化结果作为参数传进trans2 ,在函数里自己构造对象
15 print(ap.color)
json反序列化对象

  4.4  如何将大量数据写进文件?

     不用 dump. 改用dumps和loads. 对每一行分别进行处理.

    用dumps将数据逐个序列化, 并写进文件;  用loads逐行将字符串反序列化, 并输出(不能用load, 逐行读出来的字符串是不符合json语法规范, 没法load, 会直接报错).

 1 # 用json写进大量数据
 2 dic1 = {"name":"乱世佳人","show_time":1975,"score":8.5,"time":"180min"}
 3 dic2 = {"name":"闻香识女人","show_time":1998,"score":8.8,"time":"160min"}
 4 dic3 = {"name":"飞越疯人院","show_time":1973,"score":8.7,"time":"140min"}
 5 dic4 = {"name":"霸王别姬","show_time":2001,"score":9.3,"time":"150min"}
 6 lst = [dic1,dic2,dic3,dic4]
 7 # with open("movie.json","w",encoding="utf8") as f:
 8 #     for i in lst:
 9 #         s = json.dumps(i,ensure_ascii=False)
10 #         f.write(s+"\n")
11 
12 with open("movie.json","r",encoding="utf8") as f:
13     for line in f:
14         line = line.strip()
15         if not line:
16             continue
17         cont = json.loads(line)      # 只是一个反序列化操作, 把字符串式的line转成字典形式.   
18         # cont = json.load(line)        # 错误写法, 这里line只是读取了json文件的一行,并没有全部读取,
19                                         # line里面所存的字符串是不符合json语法的,没法load, 所以读取出错.
20         print(cont)
json写入大量数据

猜你喜欢

转载自www.cnblogs.com/bk9527/p/9966636.html