码迷,mamicode.com
首页 > 其他好文 > 详细

序列化模块

时间:2018-08-21 20:16:17      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:with open   输出   传输   port   erro   数据类型   换行   前端   你好   

一. 序列化模块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

  

  

序列化模块

标签:with open   输出   传输   port   erro   数据类型   换行   前端   你好   

原文地址:https://www.cnblogs.com/NachoLau/p/9513546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!