序列化模块

一. 序列化模块json

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

能存在文件和在网上传输的只能是bytes, 所以要转化成字符串

json模块只支持字符串, 字典(key不能是数字, 数字会变成字符串), 列表, 数字

json的对象不能含有元组, 集合, 字典的键不能是数字, 键如果是元组会直接报错

文件中读出来的, 网络上接收来的不能直接运行, 会有恶意代码

json在所有的语言之间都通用, 包括后端语言 java c c++ c# 和前端语言

json能够处理的数据类型非常有限

 

dic = {'key' : 'value','key2' : 'value2'}
import json
ret = json.dumps(dic)  # 序列化
print(ret)

res = json.loads(ret) # 反序列化
print(res)

向文件中记录字典
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.items())

dump load 是直接操作文件的
dic = {'key1' : 'value1','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.items())

json不支持连续存取, 需要一个个加上换行符放进文件中, 再一个个地取出来
dic = {'key1' : 'value1','key2' : 'value2'}

with open('json_file','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')

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

dumps loads
    在内存中做数据转换 :
        dumps 数据类型 转成 字符串 序列化
        loads 字符串 转成 数据类型 反序列化
dump load
    直接将数据类型写入文件,直接从文件中读出数据类型
        dump 数据类型 写入 文件 序列化
        load 文件 读出 数据类型 反序列化

dic = {'key':'你好'}
print(json.dumps(dic,ensure_ascii=False))    # 没有ensure_ascii会输出{"key": "\u4f60\u597d"}

import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
# 按键排列, 按,和:换行, 换行时空4个空格
print(json_dic2)

  

 

二. 序列化模块pickle

支持在python中几乎所有的数据类型

只能在python中使用, dumps 序列化的结果只能是字节, 而且不是utf-8或者unicode等格式的字节, 只有Python能解码

在和文件操作的时候,需要用rb wb的模式打开文件

可以多次dump和多次load

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

dump
with open('pickle_file','wb') as f:
    pickle.dump(dic,f)

load
with open('pickle_file','rb') as f:
    ret = pickle.load(f)
    print(ret,type(ret))

dic = {(1,2,3):{'a','b'},1:'abc'}
dic1 = {(1,2,3):{'a','b'},2:'abc'}
dic2 = {(1,2,3):{'a','b'},3:'abc'}
dic3 = {(1,2,3):{'a','b'},4:'abc'}
with open('pickle_file','wb') as f:
    pickle.dump(dic, f)
    pickle.dump(dic1, f)
    pickle.dump(dic2, f)
    pickle.dump(dic3, f)

with open('pickle_file','rb') as f:
    ret = pickle.load(f)
    print(ret)
    ret = pickle.load(f)
    print(ret)
    ret = pickle.load(f)
    print(ret)
    ret = pickle.load(f)
    print(ret)

with open('pickle_file','rb') as f:
    while True:
        try:
            ret = pickle.load(f)
            print(ret,type(ret))
        except EOFError:             # 报错时, 用except
            break

  

  

posted @ 2018-08-21 19:46  NachoLau  阅读(133)  评论(0编辑  收藏  举报