Python-序列化模块

序列化:字符串 bytes
序列: 列表,元祖,字符串,bytes

序列化的意思:
把其他的数据类型 转换成 字符串 bytes 序列化的过程

为什么要把其他数据类型转换成字符串??
字符串-->字符串-->通过网络去传输->字符串->字典

domps loads是操作内存的
jsons 序列号

import json
dic={'key':'value','key2':'value2'}
ret=json.dumps(dic) #序列化方法
print(dic,type(dic))
print(ret,type(ret))
{'key': 'value', 'key2': 'value2'} <class 'dict'>
{"key": "value", "key2": "value2"} <class 'str'>

loads 反序列化

import json
dic={'key':'value','key2':'value2'}
ret=json.dumps(dic)

#json.loads()
res=json.loads(ret) #反序列化
print(res,type(res))
{'key': 'value', 'key2': 'value2'} <class 'dict'>

问题:
1.json能够处理的数据类型是非常有限的只支持(字符串,列表,字典,数字)
2.字典中的key只能是字符串
3.json在所有语言之间都通用:json序列化的数据 在python上序列化了那在java中也可以反序列化

向文件中记录字典

import json
dic={'key':'value','key2':'value2'}
ret=json.dumps(dic)#序列化
with open('json_file','a') as f:
    f.write(ret)

从文件中读取字典

with open('json_file','r') as f:
    str_dic=f.read()
dic=json.loads(str_dic)
print(dic.keys())
dict_keys(['key', 'key2'])

dump load是直接操作文件的

 dic={'key':'value','key2':'value2'}
 with open('json_file','a') as f:
     json.dump(dic,f)

with open('json_file','r') as f:
    dic=json.load(f)
print(dic.keys())

dict_keys(['key', 'key2'])

需求:就是想把一个一个的字典放到文件中,在一个一个取出来
dump,load是不支持连续存,或取

dic={'key':'value','key2':'value2'}

with open('json_file1','a')as f:
    str_dic=json.dumps(dic)
    f.write(str_dic+'\n')
    str_dic=json.dumps(dic)
    f.write(str_dic+'\n')
    str_dic = json.dumps(dic)
    f.write(str_dic + '\n')
{"key": "value", "key2": "value2"}
{"key": "value", "key2": "value2"}
{"key": "value", "key2": "value2"}

with open('json_file1','r') as f:
    for line in f:
        dic= json.loads(line.strip())
        print(dic.keys())

dict_keys(['key', 'key2'])
dict_keys(['key', 'key2'])
dict_keys(['key', 'key2'])

总结
dumps loads
在内存中做数据转换
dumps 数据类型 转成字符串 序列化
loads 字符串 转成 数据类型 反序列化
dump load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
json是所有语言都通用的一种序列化格式
只支持 列表 字典 字符串 数字
字典的key必须是字符串

小扩展中文的

dic={'key':'你好'}
print(json.dumps(dic,ensure_ascii=False))
{"key":"你好"}

格式化输出

data={'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2=json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
print(json_dic2)
{
  "age":16,
  "sex":"male",
  "username":[
    "李华",
    "二愣子"
  ]
}

separators=格式化的符号
indent=空格(空多少)
sort_keys=根据key排序

pickle

支持的python中几乎所有的数据类型
只能在python中使用

dumps序列化的结果只能是字节

import pickle
dic={(1,2,3):{'a','b'},1:'abc'}
ret=pickle.dumps(dic)
print(ret)

b'\x80\x03}q\x00(K\x01K\x02K\x03\x87q\x01cbuiltins\nset\nq\x02]q\x03(X\x01\x00\x00\x00aq\x04X\x01\x00\x00\x00bq\x05e\x85q\x06Rq\x07K\x01X\x03\x00\x00\x00abcq\x08u.'

print(pickle.loads(ret))
{(1, 2, 3): {'a', 'b'}, 1: 'abc'}

dump load 也是针对文件的
在和文件操作的时候,需要用rb,wb的模式

#dump
with  open('ouckle_file','wb') as f:
    pickle.dump(dic,f)
文件里乱码
#load
with open('pickle_file','rb') as f:
    ret=pickle.load(f)
    print(ret,type(ret))

循环存取数据

dic1={(1,2,3):{'a','b'},1:abc}
dic2={(1,2,3):{'a','b'},2:abc}
dic3={(1,2,3):{'a','b'},3:abc}

with open('pickle','wb') as f:
    pickle.dump(dic1,f)
    pickle.dump(dic2,f)
    pickle.dump(dic3,f)

with open('ouckle_file','rb') as f:
        ret=pickle.load(f)
        print(ret,type(ret))
        ret=pickle.load(f)
        print(ret,type(ret))
        ret=pickle.load(f)
        print(ret,type(ret))
#但是上面这个不知道有多少个数据
with open('pickle_file','rb') as f:
    while True:
        try:
              ret=pickle.load(f)
              print(ret,type(ret))
        except EOFError:
              break

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 序列化相关 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化...
    别动我名字呀阅读 2,915评论 0 1
  • 常用模块 认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文...
    go以恒阅读 6,213评论 0 6
  • 2018年的目标 1. 晋升:提升项目管理,数据分析和英语能力 2. 完成一个半程马拉松 3. 体重100斤以下 ...
    karina_娜娜阅读 1,630评论 0 0
  • 或许是同龄人的通病吧,睡觉前总会看看手机,而后便不觉间时光飞纵,或是晚睡,或是轻微的失眠! 当我...
    失重的蜂鸟阅读 2,187评论 7 7

友情链接更多精彩内容