在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序列化数据的更多相关文章

  1. Python之数据序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  2. 【转】Python之数据序列化(json、pickle、shelve)

    [转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...

  3. Python内存数据序列化到硬盘上哪家强

    1. 闲扯一下:文件 磁盘上的数据,我们一般称为 “文件” ,一般不同的文件都有各自的后缀名,比如 .txt .docx .xlsx .jpg .mp3 .avi .这些不同类型的文件一般分为两大类: ...

  4. Protobuf在Python中的应用(序列化数据)

    1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...

  5. python序列化: json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

  6. python 序列化之JSON和pickle详解

    JSON模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...

  7. Python序列化和反序列化

    Python序列化和反序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功 ...

  8. python序列化pickle/cPickle

    一.pickle/Cpickle简介 Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游 ...

  9. python序列化与反序列

    python序列化与反序列 在python中提供了两个模块可进行序列化.分别是pickle和json.他们两者的功能都差不多,dumps和dump都是进行序列化,而loads和load则是反序列化. ...

随机推荐

  1. Redis+Keepalived实现高可用

    使用redis哨兵可以在主服务器出现故障的时候自动切换主从,但是从服务器的IP不同于原主服务器的IP还需要在客户端手动修改IP才能生效 下面使用keepalived实现VIP自动漂移 keepaliv ...

  2. Freemarker 基本数据类型

    一 数据类型简介 freemarker 模板中的数据类型由如下几种: 1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出 2. 日期型:等价于java中 ...

  3. Linux:32/64位程序(应用程序、共享库、内核模块)

    摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...

  4. 网站编辑须知9个SEO技巧

    1. 文章当中最好需要出现一个网站核心关键词所谓的网站核心的关键词就是指与网站内容相关性比较高并且是比较受欢迎的关键词,当然还有相当高的转化率 2. 文章标题当中需要出现关键词.关键字在标题标签< ...

  5. Why String is Immutable or Final in Java

    The string is Immutable in Java because String objects are cached in String pool. Since cached Strin ...

  6. javaScript错误(一)Cannot call method 'addEventListener' of null

    Cannot call method 'addEventListener' of null 原因很简单,JavaScript代码中要引用到DOM对象,但是这个DOM对象在JavaScript执行后才会 ...

  7. 常见浏览器兼容性问题与解决方案css篇

    浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同 问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大. 碰到频率:100% 解决方案:CSS里    ...

  8. python的时间差计算

    import time start = time.clock() #当中是你的程序 elapsed = (time.clock() - start) print("Time used:&qu ...

  9. 包含.h就可以用其对应的函数

    //callee.h 被调用者 #pragma once void display(); //展示函数 //callee.cpp 被调用者 #include "callee.h" ...

  10. ABAP抓取异常的方法:try,endtry

    部分转自:http://www.cnblogs.com/jiangzhengjun/p/4292428.html +4.Funcion函数异常处理 说明: 异常处理机制可以有效避免 dump发生, : ...