python IO编程-序列化
原文链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143192607210600a668b5112e4a979dd20e4661cc9c97000
在程序运行的过程中,所有变量的数据都是储存在内存中,随着程序的关闭,数据随即消失,变量所占用的内存就会被系统收回。我们把数据从内存中变成可存储或传输的的过程,就称为序列化。序列化之后,就可以把序列化的内容进行存储或者通过网络传输。反之,将变量内容从序列化对象重新读取到内从中,被称为反序列化。
在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等
磁盘
python中提供了pickle模块来实现序列化
序列化:
pickle.dumps(d) 将任意对象d序列化称为 bytes ,然后就可以将这个 bytes 写入到一个文件。 pickle.dump(d,f) (f要先open)直接将任意对象 d 序列化然后写入到一个 file-like Object :
反序列化:
当我们想要将变量内容从序列化对象读取到内存中,可以使用把序列化对象读取到一个bytes,然后在用 pickle.loads(bytes) 反序列化出对象, pickle.load(f) 直接从文件f(需要先open)反序列化对象
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
JSON
如果我们需要在不同编程语言中间传递数据,就必须将数据序列化为标准格式,如XML,但是更好的解决办法是JSON,因为JSON表示出来就是字符串,可以被所有语言读取,也可以方便的进行储存或者网络传输。JSON不仅是标准格式,而且比XML更快,并且能直接在Web页面中读取,非常方便
JSON对象表示的就是标准的JavaScript语言的对象,JSON对象和python语言内置数据类型对应如下:
JSON类型 | Python类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
1234.56 | int或float |
true/false | True/False |
null | None |
Python中内置的 json 模块提供了非常方便的python类型到JSON格式的转换
json.dumps(d) 将任意对象序列化为JSON对象,返回一个 str ,内容就是标准的JSON,类似磁盘序列化, dumps() 方法可以将序列化内容写入一个 file-like Object
loads() 和 load() 是 json 模块里的方法,前者把JSON的字符串反序列化,后者从 file-like Object 中读取字符串进行反序列化
由于JSON标准规定JSON编码是 UTF- ,所以我们总是能正确地在Python的 str 与JSON的字符串之间转换。
JSON进阶
python 的 dict 对象可以序列化为JSON的 {} ,不过我们更喜欢使用一个类 class 来表示对象,比如定义一个 student 类,然后进行序列化
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88)
print(json.dumps(s))
运行代码,肯定会出现一个 TypeError :
Traceback (most recent call last):
...
TypeError: <__main__.Student object at 0x10603cc50> is not JSON serializable
错误的原因是 Student 对象不是一个可序列化为JSON的对象。
别急,我们仔细看看 dumps() 方法的参数列表,可以发现,除了第一个必须的 obj 参数外, dumps() 方法还提供了一大堆的可选参数:
https://docs.python.org/3/library/json.html#json.dumps
这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把 Student 类实例序列化为JSON,是因为默认情况下, dumps() 方法不知道如何将 Student 实例变为一个JSON的 {} 对象。可选参数 default (像是一个修饰器,会对传入的序列换对象先处理)就是把任意一个对象变成一个可序列为JSON的对象(上面表格里的),我们只需要为Student
专门写一个转换函数,再把函数传进去即可:(default在下面)
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
这样, Student 实例首先被 student2dict() 函数转换成 dict ,然后再被顺利序列化为JSON:
>>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88}
不过,下次如果遇到一个 Teacher 类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意 class 的实例变为 dict :
print(json.dumps(s, default=lambda obj: obj.__dict__))
因为通常 class 的实例都有一个 __dict__ 属性,它就是一个 dict ,用来存储实例变量。也有少数例外,比如定义了 __slots__ 的class。
反序列化:
同样的道理,如果我们要把JSON反序列化为一个 Student 对象实例, loads() 方法首先转换出一个 dict 对象,然后,我们传入的 object_hook (和前面default类似)函数负责把 dict 转换为 Student 实例:
>>> def dict2student(d):
return Student(d['name'], d['age'], d['score'])
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
#打印出的是反序列化的Student实例对象。
对中文进行JSON序列化时, json.dumps() 提供了一个 ensure_ascii 参数,该参数值为True会将中文变为ASCII码?为False则还是中文
# -*- coding: utf-8 -*-
import json
obj = dict(name='小明', age=20)
s = json.dumps(obj,ensure_ascii=False) print(s)
#结果
{"name": "小明", "age": 20}
#为True结果
{"name": "\u5c0f\u660e", "age": 20}
python IO编程-序列化的更多相关文章
- Python IO编程
IO在计算机中指Input/Output,也就是输入和输出 一.文件读写 1.读文件 >>> f = open('/Users/michael/test.txt', 'r') --- ...
- Python高级编程-序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: dict1 = {'name': 'Rob', 'age': 19, 'score': 90} 可以随时修改变量,比如把age改成 ...
- Python IO编程-读写文件
1.1给出规格化得地址字符串,这些字符串是经过转义的能直接在代码里使用的字符串 需要导入os模块 import os >>>os.path.join('user','bin','sp ...
- python IO编程-StringIO和BytesIO
链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319187857 ...
- Python IO编程-组织文件
对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...
- python安装与IO编程
<python爬虫开发与项目实战>基础篇(一) 一.python安装 1.python IDLE 下载官网:www.python.org 注:在选择安装组件时勾选所有组件,特别注意勾选pi ...
- IO编程、操作文件或目录、序列化、JSON
IO中指Input/Output,即输入和输出:涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口 1.由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,存在速度严重不匹配问题.eg ...
- Python之IO编程
前言:由于程序和运行数据是在内存中驻留的,由CPU这个超快的计算核心来执行.当涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.由于CPU和内存的速度远远高于外设的速度,那么在IO编程中就存在 ...
随机推荐
- 12:Challenge 5(线段树区间直接修改)
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)将某连续一段同时改成一个数 ...
- POJ 2431 Expedition (priority_queue或者multiset可解)
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18655 Accepted: 5405 Descr ...
- mac下maven的安装配置与使用
转载 https://blog.csdn.net/dearKundy/article/details/80291275
- pthread_join/pthread_exit的用法解析
官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...
- SpringCloud学习笔记(3)----Spring Cloud Netflix之深入理解Eureka
1. Eureka服务端的启动过程 1.1 入口类EurekaServerInitializerConfiguration类, public void start() { (new Thread(n ...
- POJ-3348 Cows 计算几何 求凸包 求多边形面积
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...
- [ZJOI2015]幻想乡战略游戏(点分树)
题意自己看... 思路 没想到今(昨)天刷着刷着点分治的水题,就刷出来了一个点分树... 然后就疯狂地找题解,代码,最后终于把它给弄懂了. 点分树——动态点分治,对于此题来说,我们设u为当前的补给站位 ...
- 关于数组array_diff(array1, array2)求差集来比较数组是否相等的问题细究
无意中发现很多朋友都喜欢使用array_diff(array1, array2)来判断两个数组是否相等, 我自己也偶尔会这么使用 但是今天我在写代码的过程中无意发现这么做是不准确的. 首先我们来看一下 ...
- Java基础学习总结(7)——Object类
一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能 ...
- centos6.5安装配置nginx+php+mysql+httpsqs+ttserver+redis
一.准备 1.nginx, http://nginx.org/download/nginx-1.5.12.tar.gz 2.pcre, ftp://ftp.csx.cam.ac.uk/pub/soft ...