python之模块Ⅱ

2020-12-13 04:06

阅读:295

  1. 定义:将一个数据类型结构(list,dict...)转化成一个特殊的序列(特殊的字符串)的过程。

    ? 在文件存储和文件传输时有时会遇到,将原数据结构转化为str()存储在文件,或转化为bytes通过网络传输后,在读取文件或接收到文件后无法转换为原数据结构。通过序列化模块可将原数据类型转化为一种特殊的字符串,这个字符串可以与任何的数据结构相互转换。

  2. 序列化模块的分类

    ? 序列化模块可将一种数据结构转化为特殊的序列(字符串、bytes)并且还可以转换回去。目前序列化模块有三种:json模块,pickle模块,shevle模块

    • json序列化

      ? 是所有语言公认的最常用的一种序列,但是支持的python数据结构有限

      可分为两对四个方法:

      1. dumps,loads主要用于网络传输,也可以用于文件的存取

        import json
        dic = {'username': '王大锤', 'password': 123,'status': False}
        ret = json.dumps(dic)#序列化:将一个字典转换成一个字符串
        print(ret,type(ret))
        #{"username": "\u738b\u5927\u9524", "password": 123, "status": false} 
        #注意,json转换完的字符串类型的字典中的字符串是由""表示的
        ret_dict = json.loads(ret)#反序列化:将一个字符串格式的字典转换成一个字典
        print(ret_dict)
        #{'username': '王大锤', 'password': 123, 'status': False}
        #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示

        可传递参数:

        dic = {'username': '王大锤', 'password': 123,'status': False}
        ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
        print(ret,type(ret))
        #{"password": 123, "status": false, "username": "王大锤"} 

        ? 其他参数说明:ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。 separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 sort_keys:将数据根据keys的值进行排序。

        存取文件:

        import json
        dic = {'username': '王大锤', 'password': 123,'status': False}
        s_dict = json.dumps(dic)
        with open('jsonlx.json',encoding='utf-8',mode='w') as f1:
            f1.write(s_dict)
        with open('jsonlx.json',encoding='utf-8') as f2:
            content = f2.read()
            print(json.loads(content))
      2. dump,load用于文件存取

        import json
        f = open('json_file.json','w')
        dic = {'k1':'v1','k2':'v2','k3':'v3'}
        json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
        f.close()
        # json文件也是文件,就是专门存储json字符串的文件。
        f = open('json_file.json')
        dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
        f.close()
        print(type(dic2),dic2)
      3. 将多个数据存储到文件中

        import json
        dic1 = {'username': '王大锤', 'password': 123,'status': False}
        dic2 = {'username': 'abc', 'password': 123,'status': False}
        dic3 = {'username': 'ly', 'password': 123,'status': False}
        with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
            f1.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')
        
        with open('jsonmore.json',encoding='utf-8') as f1:
            for line in f1:
                ret = json.loads(line)
                print(ret,type(ret))
    • pickle序列化

      1. dumps,loads只能用于网络传输

        import pickle
        l1 = ['wusir', '太白', '小黑', 666]
        ret = pickle.dumps(l1)
        print(ret)
        #b'\x80\x03]q\x00(X\x06\x00\x00\x00\xe5\xb0\x8f\xe9\xbb\x91q\x01M\x9a\x02e.'
        l2 = pickle.loads(ret)
        print(l2,type(l2))
        ['小黑', 666] 
      2. dump,load只能用于文件存取

        import pickle
        l1 = ['wusir', '太白', '小黑', 666]
        with open('pickle练习.pickle',mode='wb') as f1:
            pickle.dump(l1,f1)
        
        with open('pickle练习.pickle', mode='rb') as f1:
            ret = pickle.load(f1)
            print(ret,type(ret))
      3. 多个数据写入

        # 多个数据写入文件
        l1 = ['wusir', '太白', '小黑1', 666]
        l2 = ['wusir', '太白', '小黑2', 666]
        l3 = ['wusir', '太白', '小黑3', 666]
        with open('pickle练习1.pickle',mode='wb') as f1:
            pickle.dump(l1,f1)
            pickle.dump(l2,f1)
            pickle.dump(l3,f1)
        
        with open('pickle练习1.pickle', mode='rb') as f1:
            ret1 = pickle.load(f1)
            ret2 = pickle.load(f1)
            ret3 = pickle.load(f1)
            print(ret1,ret2,ret3)

上一篇:JavaSE复习4

下一篇:JDK安装(win7系统)


评论


亲,登录后才可以留言!