python序列化数据
在python中序列化数据可以使用两种不同模块,一种是json格式,另一种是pickle模块!
序列化的概念:
序列化:将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等。
反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。
JSON模块
json是一种在各个通用的格式,因此可以跨语言之间的去传递数据。
json:一种轻量级数据交互格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,json是javascript的一个子集。
python的json模块序列化与反序列化的过程分别是encoding和decoding。
- encoding:把一个python对象编码转换成Json字符串,对应的方法是load和loads。
- decoding:把json格式字符串编码转换成python对象,对应的方法是dump和dumps。
json模块提供了四个方法:dump , load, dumps, loads
json的dumps方法与loads方法:dumps把python对象格式化为json字符串保存在变量中,loads方法把json字符串反序列化为python对象。
# dumps功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串
In [2]: data = ["a","bb","ccc"] In [3]: j_data = json.dumps(data) In [4]: j_data
Out[4]: '["a", "bb", "ccc"]' In [5]: type(j_data)
Out[5]: str # loads功能
# 将json编码的字符串再转换为python的数据结构
In [6]: meg = json.loads(j_data) In [7]: meg
Out[7]: [u'a', u'bb', u'ccc'] In [8]: type(meg)
Out[8]: list
dump与load的功能与上面的一样,只不过是把数据保存在文件中。
# dump功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
In [11]: with open("/tmp/tmp.json","wr") as fd:
....: json.dump(data,fd)
....:
[root@db2 tmp]# cat tmp.json
["a", "bb", "ccc"]
[root@db2 tmp]# # load功能
# 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构
In [1]: import json In [2]: fd = open("/tmp/tmp.json","r") In [3]: data = json.load(fd) In [4]: data
Out[4]: [u'a', u'b', u'c'] #注意编码格式
对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。
json编码的格式几乎和python语法一致,略有不同的是:True会被映射为true,False会被映射为false,None会被映射为null,元组()会被映射为列表[],因为其他语言没有元组的概念,只有数组,也就是列表。
一些参数使用(摘录):
- ensure_ascii 默认为True,保证转换后的json字符串中全部是ascii字符,非ascii字符都会被转义。如果数据中存在中文或其他非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常。
- indent 缩进,默认为None,没有缩进,设置为正整数时,输出的格式将按照indent指定的半角空格数缩进,相当实用。
- separators 设置分隔符,默认的分隔符是(',', ': '),如果需要自定义json中的分隔符,例如调整冒号前后的空格数,可以按照(item_separator, key_separator)的形式设置。
- sort_keys 默认为False,设为True时,输出结果将按照字典中的key排序。
data
Out[23]: {'a': True, 'b': False, 'c': None, 'd': (1, 2), 1: 'abc', 'cn': ['中国-北京']} jdata1 = json.dumps(data) #使用默认参数 print(jdata1)
{"a": true, "b": false, "c": null, "d": [1, 2], "": "abc", "cn": ["\u4e2d\u56fd-\u5317\u4eac"]} jdata2 = json.dumps(data,ensure_ascii=False, indent=4) #修改参数 print(jdata2)
{
"a": true,
"b": false,
"c": null,
"d": [
1,
2
],
"": "abc",
"cn": [
"中国-北京"
]
}
pickle模块的使用
json模块是各种编程语言通用的数据格式,pickle是python自带的序列化格式。
在python2中有pickle和cpickle两个模块,在python3中只有pickle一个模块。
pickle对应的也有四个方法和dump和load, dumps和loads。
In [1]: l1 = [1,2,3]
In [2]: l2 = ["a","c","d"]
In [3]: l3 = {1:"a", 2:"c", 3:"d"}
In [5]: fd = open("pickle.kpi", "a")
In [6]: import pickle #按顺序把三个列表序列化到文件中
In [8]: pickle.dump(l1,fd)
In [9]: pickle.dump(l2,fd)
In [10]: pickle.dump(l3,fd)
In [11]: fd.close()
In [12]: fd = open("pickle.kpi", "r")
In [13]: s1 = pickle.load(fd) #注意反序列化时,读出列表的顺序,遵循先进先出的原则
In [14]: s1
Out[14]: [1, 2, 3]
In [16]: s2 = pickle.load(fd)
In [17]: s2
Out[17]: ['a', 'c', 'd']
In [19]: s3 = pickle.load(fd)
In [20]: s3
Out[20]: {1: 'a', 2: 'c', 3: 'd'}
python序列化数据的更多相关文章
- Python之数据序列化(json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
- Python内存数据序列化到硬盘上哪家强
1. 闲扯一下:文件 磁盘上的数据,我们一般称为 “文件” ,一般不同的文件都有各自的后缀名,比如 .txt .docx .xlsx .jpg .mp3 .avi .这些不同类型的文件一般分为两大类: ...
- Protobuf在Python中的应用(序列化数据)
1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...
- python序列化: json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- python 序列化之JSON和pickle详解
JSON模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...
- Python序列化和反序列化
Python序列化和反序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功 ...
- python序列化pickle/cPickle
一.pickle/Cpickle简介 Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游 ...
- python序列化与反序列
python序列化与反序列 在python中提供了两个模块可进行序列化.分别是pickle和json.他们两者的功能都差不多,dumps和dump都是进行序列化,而loads和load则是反序列化. ...
随机推荐
- OOA/D 01
建筑师一般不会为一栋100层的楼添加一个新的地下室,因为成本太高无疑会失败,但软件系统里提出类似改动需求时,他们通常都不会多想一下,相反他们会说:这只是一个简单的编程问题 可总会有一些看似极难完成.但 ...
- php curl常见错误:SSL错误、bool(false)
症状:php curl调用https出错 排查方法:在命令行中使用curl调用试试. 原因:服务器所在机房无法验证SSL证书. 解决办法:跳过SSL证书检查. curl_setopt($ch, CUR ...
- Python之re模块正则表达式
re模块用于对python的正则表达式的操作 字符: .匹配除换行符以外的任意字符 \w匹配字母或数字或下划线或汉字 \s匹配任意空白符 \b匹配单词的开始或结束 ^匹配字符串的开始 $匹配字符串的结 ...
- 肖俊:HPE IT 的DevOps 实践分享
本篇文章来自于HPE和msup共同举办的技术开放日HPE测试技术总监肖俊的分享,由壹佰案例整理编辑. 一.DevOps含义解析 这是DevOps的趋势图.DevOps这个概念大概是在2009年被提出来 ...
- 它是对 ACME(automated certificate management environment) 协议的实现,只要实现了 ACME 协议的客户端都可以跟它交互。
它是对 ACME(automated certificate management environment) 协议的实现,只要实现了 ACME 协议的客户端都可以跟它交互. https://mp.we ...
- Mysql技术内幕——InnoDB存储引擎
Mysql技术内幕——InnoDB存储引擎 http://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html 一.mysql体系结构和存储引 ...
- 为什么GPU可以用于科学计算【转载】
转自:https://blog.csdn.net/xihuanyuye/article/details/81178352 https://www.zhihu.com/question/35063258 ...
- localhost和本机IP和127.0.0.1之间的区别
参考出处:https://www.zhihu.com/question/23940717 localhost 是个域名,不是地址,它可以被配置为任意的 IP 地址,不过通常情况下都指向 127.0.0 ...
- java和python中的string和int数据类型的转换
未经允许,禁止转载!!! 在平时写代码的时候经常会用到string和int数据类型的转换 由于java和python在string和int数据类型转换的时候是不一样的 下面总结了java和python ...
- 通过脚本获取form表单的数值而不是submit
jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直接选择form将其序列化,如: <form action=" ...