• 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+"
    ")
    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写入大量数据
  • 相关阅读:
    Qt Undo Framework
    pyinstaller打包shotgun有关的程序
    博客初衷
    文件隐写
    IDA使用初探-1.启动IDA
    隐写术总结
    无线网破解 跑字典 EWSA使用教程
    CTF中图片隐藏文件分离方法总结
    【转载】Pangolin4.0最新破解版-SQL注入渗透工具
    名词解释
  • 原文地址:https://www.cnblogs.com/bk9527/p/9966636.html
Copyright © 2020-2023  润新知