序列化:字符串 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