序列化      数据类型---》str   一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
反序列化    str---》数据类型
序列化三大方法:json *****    pickle ****      shelva ***
序列化的目的
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

序列化目的

一、json
四种方法:dumps    loads    在内存角度的操作
dump load 和文件操作相关是序列化操作
优点:通用的序列化方法
缺点:只有很少的一部分数据类型可以通过json转换: dict str tuple (set不可以)

json

1.dumps序列
import json
dic={'a':1,'m':2}
str_d=json.dumps(dic)
print(type(str_d),str_d) #<class 'str'> {"m": 2, "a": 1} str 数据类型 m a 键值都变成了双引号
#注意,json转换完的字符串类型的字典中的字符串是由""表示的

dumps

2.loads反序列化
dic='{"a":1,"m":2}'
dic_d=json.loads(dic)
print(type(dic_d),dic_d) #<class 'dict'> {'a': 1, 'm': 2} dict数据类型
#注意:要被反序列化的内容必须是str类型

loads

3. dump 序列化 和 和文件操作相关

import json
f=open('文件','w',encoding='utf-8')
dic={'k':1,'k2':2,'k3':3}
json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
json.dump(dic,f) #再次写入,是可以的,但是在反序列化的时候不支持一次性读取,load是一行一行的读
f.close()

dump

# 不支持分次load,多次序列化写入,还要反序列化的解决方法:
首先实现 一行一行序列化写入
l = [{'k':''},{'k2':''},{'k3':''}]   #转为列表为了下面的循环
f = open('file','w')
import json
for dic in l:
str_d=json.dumps(dic)
f.write(str_d+'\n')
f.close()
其次实现反序列化实现一行写出
import json
f=open('file','r')
l=[]
for i in f :
ret=json.loads(i.strip())
l.append(ret)
f.close()
print(l) # [{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
4.load 反序列化
f=open('文件','w',encoding='utf-8')
dic={'k':1,'k2':2,'k3':3}
json.dump(dic,f)
f=open('文件','r',encoding='utf-8')
ret=json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(ret),ret) #得到一个bytes类型的

load

5.ensure_ascii
json dumps有个参数 ensure_ascii 默认是True 序列化写进文件是不看懂的byts类型,如果想看就要改成False
import json
f = open('file','w',encoding='utf-8')
json.dump({'国籍':'中国'},f)
ret = json.dumps({'国籍':'中国'})
f.write(ret+'\n')
{"\u56fd\u7c4d": "\u4e2d\u56fd"}{"\u56fd\u7c4d": "\u4e2d\u56fd"}看不

ensure_ascii

 更改参数ensure_ascii=False
json.dump({'国籍':'美国'},f,ensure_ascii=False)
ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
f.write(ret+'\n')
f.close() #{"国籍": "美国"}{"国籍": "美国"}

ensure_ascii=False

二、pickle
优点:可以把python中任意的数据类型序列化,  支持分次load
缺点:pickle序列化的内容只有python能理解,且部分反序列化依赖python代码
注释:dumps之后得到bytes类型,所以文件打开要用 wb
四种方法:dumps loads
dump load 和文件操作相关是序列化操作
1  dumps
dic={'a':1,'b':2,'c':3}
str_d=pickle.dumps(dic)
print(type(str_d),str_d) #<class 'bytes'> b'\x80\x03}q\x00(X\x01\x00\x00\x00bq\x01K\x02X\x01\x00\x00\x00aq\x02K\x01X\x01\x00\x00\x00cq\x03K\x03u.'
1 loads
ret=pickle.loads(str_d)
print(type(ret),ret) #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}

dumps

2  loads
ret=pickle.loads(str_d)
print(type(ret),ret) #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}

loads

3:dump
f=open('文件','wb')
dic={'a':1,'b':2,'c':3}
dic_d=pickle.dump(dic,f)
print(dic_d) #None
f.close()

dump

4.load  #反序列化
f=open('文件','rb')
ret=pickle.load(f)
print(ret) #{'c': 3, 'b': 2, 'a': 1}

load

三、shelva  python3 中添加的
序列化句柄
使用句柄直接操作,非常方便
加上writeback=True ,则对于字符串的任何操作都可以被记录
import shelve
f=shelve.open('file1')
f['key']={'cc':1,'mm':2}
f.close()

序列化

f1=shelve.open('file1')
ret=f1['key']
print(ret) #{'mm': 2, 'cc': 1}
#取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f.close()

反序列化

 1.writeback  的用法
import shelve
f=shelve.open('file1')
f['key']={'cc':1,'mm':2}
print(f['key']) #{'cc': 1, 'mm': 2}
f['key']['nem_name']='aaaaaaaaa'
f.close() f1=shelve.open('file1',writeback=True)
f1['key']['nem']='bbb'
print(f1['key']) #{'cc': 1, 'mm': 2, 'nem': 'bbb'}
f1.close()

python--序列化:json、pickle、shelva的更多相关文章

  1. python 序列化 json pickle

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  2. Python(序列化json,pickle,shelve)

    序列化 参考:https://www.cnblogs.com/yuanchenqi/articles/5732581.html # dic = str({'1':'111'}) # # f = ope ...

  3. Pythoy 数据类型序列化——json&pickle 模块

    Pythoy 数据类型序列化--json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什 ...

  4. Python基础-序列化(json/pickle)

    我们把对象(变量)从内存中变成可存储的过程称之为序列化,比如XML,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等 ...

  5. python学习之文件读写,序列化(json,pickle,shelve)

    python基础 文件读写 凡是读写文件,所有格式类型都是字符串形式传输 只读模式(默认) r  f=open('a.txt','r')#文件不存在会报错 print(f.read())#获取到文件所 ...

  6. Day 4-5 序列化 json & pickle &shelve

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 反序列化: 把字符转成内存里的数据类型. 用于序列化的两个模块.他 ...

  7. python之json&pickle

    用于序列化的两个模块: json:用于字符串和python数类型间进行转换 oickle:用于python特有的类型和python的数据类型间进行转换 json.pickle模块提供四个功能:dump ...

  8. python基础--json,pickle和shelve模块

    一.JSON &pickle 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换  字符串必须是双引号,不能是单引号 pickle,用于python特有的类型 和 ...

  9. 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

    json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] ...

  10. day 19 os模块的补充 序列化 json pickle

    os   模块 os.path.abspath  规范绝对路径 os.path.split() 把路径分成两段,第二段是一个文件或者是文件夹 os.path.dirname    取第一部分 os.p ...

随机推荐

  1. join()和split()

    一.join()方法 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 如序列为字典,只连接字典里的键 序列里的元素也需要是字符串,如果不为字符串,则会报错 二. ...

  2. InnoDB与Myisam比较

    InnoDB与Myisam比较                                                                                     ...

  3. sass揭秘之@mixin,%,@function scss基本使用及操作函数

    sass揭秘之@mixin,%,@function: 地址:https://www.w3cplus.com/preprocessor/sass-mixins-function-placeholder. ...

  4. Python 如何debug

    一.常见错误: 1.漏了末尾的冒号,如 if语句,循环语句,定义函数 2.缩进错误,该缩进的时候没有缩进 3.把英文符号写成中文符号,如:  ' ' () , 4.字符串拼接,把字符串和数字拼接一起 ...

  5. display的inline-block替代float的一些场景

    一.横向菜单 inline-block是不换行的块级元素,对于使用ul-li结构的网页顶部横向导航菜单非常有用. 如果不使用inline-block属性,只能使用float来浮动每个li元素,写起来比 ...

  6. Excel解析工具POI

    HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 对于不同版本的EXCEL文 ...

  7. Java原理领悟-JMM(java内存模型认知)

    总线锁.缓存锁.MESI缓存一致性协议.CPU 层面的内存屏障 1.JMM定义: Java Memory Model(java内存模型)是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见 ...

  8. 树莓派上Opencv highgui的问题

    错误描述:https://bbs.csdn.net/topics/394616975?page=1#post-409508178 解决方案:直接改系统环境变量 # vim /etc/profile e ...

  9. less&sass

    定义: less是一种动态样式语言,对css赋予了动态语言的特性,比如变量.继承.运算.函数,既可以运行在客户端,也可以运行在服务器端,依赖JavaScript   sass是一种动态语言,属于缩排语 ...

  10. Ubuntu 14.04 Sublime Text3 Java编译运行(最简单的方法)

    Sublime,结果发现只能编译,无法直接运行,于是就在网上搜解决方法,发现大部分方法都是告诉你要进入Java.sublime-packag这个文件,然后再修改JavaC.sublime-build, ...