前提:

文本文件中只能写入字符串或ascii码格式的内容。

info={'name':'zoe','age':18}
f=open('test.txt','w')
f.write(info) #在文本文件中写入字典格式的内容,执行会报错。
f.closed()

变通方式将 f.write(info) 改为 f.write(str(info))。

但是这种写法比较低端。

同时,将文件通过open()读取到环境中,读取进来的还是字符串格式的。上面的操作是序列化,读取文件后的操作时反序列化。

f=open('test.txt','r')
data=f.read()
print(type(data)) #返回class 'str'
#想要保留数据的原本的格式,还需要将数据转化。
data_new=eval(data)
print(type(data_new))
print(data_new)

返回:

但是上面的序列化和反序列化的方式不是常规的用法。只是在我们不了解序列化模块json,pickle的时候的用法。接下来我们介绍用于序列化的两个模块。

用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

json

实例1:

import json
info={'name':'zoe','age':18}
f=open('test.txt','w')
f.write(json.dumps(info)) #序列化。将info转换为字符串,写入文本文件中
f.close()
import json
f=open('test.txt','r')
data=json.loads(f.read()) #反序列化。用loads方法将字符串
print(data(type))
f.close()

实例2:

>>> import json
>>> def sayhi(name):
print('hello,',name) >>> info={'name':'zoe','age':18,'func':sayhi}
>>> f=open('test.txt','w') >>> f.write(json.dumps(info)) #函数sayhi的内存地址不是json可以序列化的参数。
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
f.write(json.dumps(info))
File "C:\Users\Zoe\Anaconda3\lib\json\__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 198, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 256, in iterencode
return _iterencode(o, 0)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable

所以,json只能支持简单的数据类型,如字典,列表,字符串等。——

json主要用于不同的语言之间进行数据交互。比方说java和python之间的字典的交互,类,函数等复杂的json是无法进行处理,在不同语言之间进行交互。

xml主要在不同的语言和程序之间进行数据交互,是一种标记式的语言,正在逐渐被json给取代。因为json更简洁,更清晰。json是目前主流的在不同语言之间进行数据交互的模块。

json只能处理简单的,而pickle是用来处理复杂的数据类型。

json和pickle的操作和json一模一样。

pickle

实例1:

import pickle
def sayhi(name):
print('hello,',name) info={'name':'zoe','age':18,'func':sayhi}
f=open('test.txt','wb') #以二进制方式写入文件
f.write(pickle.dumps(info)) #pickle.dump(info,f)完全等价
f.close()

反序列化:

import pickle
def sayhi(name):
print('hello world',name) f=open('test.txt','rb')
a=pickle.loads(f.read()) #完全等价于pickle.load(f)
print(a)
a['func']('zoe')
'''如果反序列化中程序中没有sayhi()函数,则会报错。然而,在程序中有定义的同名的sayhi()函数即可读取并调用。
两个程序之间的内存地址是不能互相访问的,所以在函数序列化中,
pickle只能在python中使用。'''

小知识:

json和pickle在文件写入过程中dumps两次,会写入两次;

json和pickle在文件中loads,在3.x中只能loads一次。

在2.x中第一次dump的,可以第一次loads。但是这个不好。

所以对于同一个文件的写入和读取记住只dump一次,load一次。如果想要每个都要dump一次,则dump成不同的文件。

Json & pickle 数据序列化的更多相关文章

  1. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  2. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  3. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  4. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  5. json&pickle数据序列化模块

    用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...

  6. Python3 json &pickle 数据序列化

    json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...

  7. json & pickle数据序列化

    序列化:把内存中的数据对象变成字符串 info = { 'name':'tom', 'age':22 } f = open("test.txt","w") f. ...

  8. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  9. 装饰器、生成器,迭代器、Json & pickle 数据序列化

    1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...

随机推荐

  1. MySQL服务使用cmd启动与停止服务

    MySQL未设置自动启动,在使用时需要手动打开服务,方法如下 mysql服务的启动: 以管理员的身份运行cmd命令窗口,输入命名 net start mysql 提示:必须使用管理员身份运行cmd 如 ...

  2. Light of future-冲刺集合

    table th:nth-of-type(1) { width: 85px; } table th:nth-of-type(2){ width: 80px; } table th:nth-of-typ ...

  3. ML-Agents(六)Tennis

    目录 ML-Agents(六)Tennis 一.Tennis介绍 二.环境与训练参数 三.场景基本结构 四.代码分析 环境初始化脚本 Agent脚本 Agent初始化与重置 矢量观测空间 Agent动 ...

  4. 1006 Sign In and Sign Out (25 分)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  5. 定位 iframe

    定位iframe # 1.有id,并且唯一,直接写id driver.switch_to_frame("x-URS-iframe") driver.switch_to.frame( ...

  6. 【JavaScript】js01

    一,javascript 历史. netscape -> 浏览器. -> livescript 微软 -> jscript netscape -> ecma 组织 -> ...

  7. 【php】PDO

    一.PDO的定义 1.pdo(php data object)是一个数据库的抽象层 二.PDO的特点 1.跨数据库 2.支持预处理 3.支持事务处理 三.PDO的使用 1.基本使用 (1)实例化pdo ...

  8. java对于目录下的相关文件的单词操作

    写入文件的目录.代码通过找目录下的文件,进行相关函数的操作.如果目录下面包含子目录.代码设有调用递归的方法,在寻找子目录下的文件 在进行相关的函数操作.函数主要是按用户输入的个数要求输出文件中出现次数 ...

  9. flask 入门之 logging

    如想看详细说明,请到: 1.https://www.cnblogs.com/yyds/p/6901864.html 2.https://docs.python.org/2/library/loggin ...

  10. 多线程高并发编程(3) -- ReentrantLock源码分析AQS

    背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...