json、pickle模块

json、pickle模块

  • json是将数据转换成特殊的字符串然后传输,pickle是之间转换成bytle形式进行传输

  • json转换有限制,pickle没有并且可以直接对函数和类进行转换

  • json适合多种语言之间传输转换,而pickle只能在python中使用

  • 序列化模块:将一种数据结构(list、tuple、dict....)转化成特殊的序列

  • 为什么存在序列化:

    • 数据在存储的过程中是以str(bytes)形式存储,比如字典,数据通过网络传输也是bytes类型,但是

      dict----->str<----->bytes,bytes不能和字典、元组等等类型进行转换只能和str进行转换

  • 特殊字符串:序列化

pickle模块

  1. 不同语言都遵循一种数据转化格式,即不同语言都使用的特殊字符串。(比如python的一个列表[1,2,3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(php中的列表称为数组[1,2,3])

  2. json序列化只支持部分python数据结构:dict、list、tuple、str、int、float、True、False、None

  • json:将数据结构转化成特殊的字符串,并且可以反转回去

  • 网络传输:

    • dumps,loads主要用于网络传输,但也可以用来读写文件(进行文件读写的时候不用转换成bytes是因为open内部已经对文件进行了转换)

    • dumps将数据类型(以下举例的是dict)转换成特殊字符串,

      dic={'name':'xiaoxiannv','age':20}
      import json
      s1=json.dumps(dic,ensure_ascii=False)  #ensure_ascii=False将元素里面的中文转换成中文格式
      print(s1,type(s1))
      得:
      {"name": "xiaoxiannv", "age": 20} <class 'str'>
      
    • loads 将特殊字符串转换成之前的数据类型

      dic={'name':'xiaoxiannv','age':20}
      import json
      s1=json.dumps(dic,ensure_ascii=False)  #ensure_ascii=False将元素里面的中文转换成中文格式
      print(s1,type(s1))
      s2=json.loads(s1)
      print(s2,type(s2))
      
      得:
      {"name": "xiaoxiannv", "age": 20} <class 'str'>
      {'name': 'xiaoxiannv', 'age': 20} <class 'dict'>
      
    • dumps将非字符串转化成特殊字符串写入文件,loads将特殊字符读取出来转换成原本的数据类型

      dic={'name':'xiaoxiannv','age':20}
      import json
      with open('json文件',mode='w',encoding='utf-8')as f1:
          s1=json.dumps(dic,ensure_ascii=False)
          f1.write(dic)
      #将特殊字符读取出来转换成原本的数据类型
      with open('json文件',mode='r',encoding='utf-8')as f1:
          s2=f1.read()
          d1=json.loads(s2)
          print(d1,type(d1))
      
  • dump,load(绝对不能用于一次性写入多个数据,否则报错)

    • 只能读写入文件,只能读写入一个数据结构

      dic={'name':'xiaoxiannv','age':20}
      import json
      with open('json文件',mode='w',encoding='utf-8')as f1:
          s1=json.dump(dic,f1)  #内部已经调用了write和read
      with open('json文件',mode='r',encoding='utf-8')as f2:
          d1=json.load(f2)
          print(d1,type(d1))
      
  • 一次性写入多个数据

    dic={'name':'xiaoxiannv','age':20}
    dic1={'name':'wangminmin','age':18}
    dic2={'name':'xiaotong','age':18}
    
    # 写入
    with open('wenjian.txt',mode='w',encoding='utf-8')as f1:
        f1.write(json.dumps(dic)+'\n')
        f1.write(json.dumps(dic1)+'\n')
        f1.write(json.dumps(dic2)+'\n')
    
    # 读取
    with open('wenjian.txt',mode='r',encoding='utf-8')as f2:
        for i in f2:
            print(json.loads(i))
    # {'name': 'xiaoxiannv', 'age': 20}
    # {'name': 'wangminmin', 'age': 18}
    # {'name': 'xiaotong', 'age': 18}
    

pickle模块

  1. 只能是python语言遵循的一种数据转化格式,只能在python语言中使用。

  2. 只支持python所有的数据类型包括实例化对象

  • pictle模块:将数据结构转化成bytes,并且可以反转回去(pickle中的dumps和loads不能进行文件操作)

    dic={'name':'xiaoxiannv','age':20}
    import pickle
    
    b1=pickle.dumps(dic)
    print(b1,type(b1))
    
    d2=pickle.loads(b1)
    print(d2,type(d2))
    
    得:
    b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe5\xae\x9d\xe5\x88\xa9q\x02X\x03\x00\x00\x00ageq\x03K\x14u.' <class 'bytes'>
    {'name': 'xiaoxiannv', 'age': 20} <class 'dict'>
    
  • pickle模块中的dump和local可以进行写入多个文件

    dic={'name':'xiaoxiannv','age':20}
    dic1={'name':'wangminmin','age':18}
    dic2={'name':'xiaotong','age':18}
    
    #
    with open('wen.txt',mode='wb')as f1:
        pickle.dump(dic,f1)
        pickle.dump(dic1,f1)
        pickle.dump(dic2,f1)
    
    
    with open('wen.txt',mode='rb')as f1:
        while True:
            try:
                print(pickle.load(f1))
            except EOFError:
                break
    
posted @ 2021-06-04 19:11  刘家小仙女  阅读(66)  评论(0编辑  收藏  举报