序列化 : 把其他的数据类型转换成 字符串或者bytes
序列 : 列表、元组、字符串、bytes

为什么要把其他数据类型转换成字符串?
能够在网络上传输的只能是bytes,能够存储在文件里的只有bytes和str

网络传输过程
字典 -> 字符串 -通过网络去传输-> 字符串 -> 字典

序列化 字典 -> 字符串,可以直接使用str()
str_dic = str([1,2,3])
print(str_dic,type(str_dic))
输出:[1, 2, 3] <class 'str'>

反序列化 字符串 -> 字典 使用eval()(从文件中读出来的或者网络上接收来)
str_dic = str([1,2,3])
res = eval(str_dic)
print(res,type(res))
输出:[1, 2, 3] <class 'list'>
注意:eval()函数十分强大,但eval官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
强大的函数有代价。安全性是其最大的缺点。
比如"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
val('import os;os.remove('c:')')
所以,不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构),需要使用json、pickle做序列化

序列化的目的

1、以某种存储形式使自定义对象持久化
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

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

json是所有语言都通用的一种序列化格式

  只支持 列表 字典 字符串 数字

  字典的key必须是字符串

序列化之后的json没有单引号,只有双引号,因为json只支持双引号

# import json

# 问题1 字典中的int类型,序列化及反序列化后变成字符串类型
# dic = {1: 'value', 2: 'value2'}
# ret = json.dumps(dic) # 序列化
# print(dic, type(dic))
# print(ret, type(ret))
# res = json.loads(ret) # 反序列化
# print(res, type(res))
# 问题2 元组变成了列表
# dic = {1: [1, 2, 3], 2: (4, 5, 'aa')}
# ret = json.dumps(dic) # 序列化
# print(dic, type(dic))
# print(ret, type(ret))
# res = json.loads(ret) # 反序列化
# print(res, type(res))

# 问题3 集合类型不能作为键,序列化
# s = {1, 2, 'aaa'}
# json.dumps(s) # 问题4 元组不能作为键 # TypeError: keys must be a string
# json.dumps({(1, 2, 3): 123}) # 向文件中记录字典
# dic = {'key1' : 'value1','key2' : 'value2'}
# ret = json.dumps(dic) # 序列化
# with open('json_file','w') as f:
# f.write(ret) # # 从文件中读取字典
# with open("json_file") as f:
# content = f.read()
# ret = json.loads(content)
# print (ret,content)
# print (type(ret))
# print (type(content)) # load dump 直接操作文件
# dic = {'key1' : 'value1','key2' : 'value2'}
# with open("json_file","w") as f:
# json.dump(dic,f) # with open("json_file") as f:
# ret = json.load(f)
# print (ret["key1"]) # 问题5 不支持连续的存 取
# dic = {'key1' : 'value1','key2' : 'value2'}
# with open('json_file','a') as f:
# json.dump(dic,f)
# json.dump(dic,f)
# json.dump(dic,f) # with open('json_file','r') as f:
# dic = json.load(f)
# print(dic.keys()) # 需求 :强行要把一个一个的字典放到文件中,再一个一个取出来?
# dic = {'key1' : 'value1','key2' : 'value2'} # with open('json_file','w') 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())

json.dumps(),各个参数含义

Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key

ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。)

Iindent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

sort_keys:将数据根据keys的值进行排序。

 

import json
data = {'username':['呜呜呜','奋斗奋斗'],'sex':'m','age':24}
json_dic = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
print(json_dic)

pickle

1、支持在python中几乎所有的数据类型
2、dumps 序列化的结果只能是字节
3、只能在python中使用
4、在和文件操作的时候,需要用rb wb的模式打开文
5、可以多次dump 和 多次load

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

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

用于序列化的两个模块

json,用于字符串 和 python数据类型间进行转换

pickle,用于python特有的类型 和 python的数据类型间进行转换

pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)

这既然pickle如此强大,为什么还要学json呢?
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

												

python3-常用模块之序列化的更多相关文章

  1. python3 常用模块详解

    这里是python3的一些常用模块的用法详解,大家可以在这里找到它们. Python3 循环语句 python中模块sys与os的一些常用方法 Python3字符串 详解 Python3之时间模块详述 ...

  2. Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)

    主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...

  3. python3 常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们 ...

  4. Python3 常用模块1

    目录 os模块 对文件夹操作 对文件进行操作 sys模块 json 和pickle模块 logging模块 日志等级 longging模块的四大组件 自定义配置 os模块 通过os模块我们可以与操作系 ...

  5. Python3常用模块的安装

    1.mysql驱动:mysql-connector-python 1.安装 $ pip3 install mysql-connector-python --allow-external mysql-c ...

  6. Python3 常用模块3

    目录 numpy模块 创建numpy数组 numpy数组的属性和用法 matplotlib模块 条形图 直方图 折线图 散点图 + 直线图 pandas模块 numpy模块 numpy模块可以用来做数 ...

  7. Python3 常用模块2

    目录 time 模块 时间戳形式 格式化时间 结构化时间 time.time() time.sleep() datetime 模块 random 模块 hashlib 模块 和 hmac 模块 typ ...

  8. 【Python3之常用模块】

    一.time 1.三种表达方式 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.命令如下 ...

  9. 09 . Python3之常用模块

    模块的定义与分类 模块是什么? 一个函数封装一个功能,你使用的软件可能就是由n多个函数组成的(先备考虑面向对象).比如抖音这个软件,不可能将所有程序都写入一个文件,所以咱们应该将文件划分,这样其组织结 ...

  10. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

随机推荐

  1. nginx代理配置备份

    补充: 代理对文件大小的限制, server {client_max_body_size 100M;listen 9096;server_name gate.chaohuoyy.com; locati ...

  2. Leetcode976. Largest Perimeter Triangle三角形的最大周长

    给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...

  3. webstorm安装与破解

    1.下载webstorm和补丁文件 链接:https://pan.baidu.com/s/1aiHxPExAbDCcHxKtB82_vg 提取码:jo07 链接:https://pan.baidu.c ...

  4. odoo 分组视图下显示同一批次记录的总数

    修改前: 修改后: xml文件: <?xml version="1.0" encoding="utf-8"?> <!-- vim:fdn=3: ...

  5. thinkphp 默认值输出

    我们可以给变量输出提供默认值,例如: 大理石平台厂家 {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例如: {$ ...

  6. webpack官方文档学习

    一.webpack是什么? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 二.安装 前提条 ...

  7. csp-s模拟测试80(b)

    csp-s模拟测试80(b) 水题没什么可写的. $T1SB$规律题正解调了仨小时就过了. $T2SBDp$题颓完题解就秒了. $T3SB$数据结构考场想到正解就弃了,考后太懒一半正解一发随机化就A了 ...

  8. myeclipse CTRL+1功能

    有时候,在myeclipse或者eclipse中自动编译代码有错误,我们把鼠标放在错误一行能够自动显示出问题原因,但是有时显示问题让人有些匪夷所思,不知所云何物. 此时可以使用<ctrl> ...

  9. 总结加密、机密jar中的class

    1.加密和解密部署到jboss中间件中的的单个class文件,原理:使用“java源程序加密解决方案(基于Classloader解密) (2014-07-13 11:31)”blog即可实现: imp ...

  10. skyline中大数据量的三维场景刷新速度问题

    我们做了一个的类似于TE Pro的桌面系统来代替TE Pro演示我们的大三维场景.我们的三维场景包括100平方公里的全要素场景,有建筑物,地面.小品.部件.植被等.在系统运行后,三维场景刷不起来,速 ...