json&pickle序列化

一、用途

  我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。

二、json序列化

1、dumps序列化和loads反序列化

dumps把数据类型转换成字符串

import json

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘
}

data = json.dumps(info)
print(data)
print(type(data))

# 输出
{"name": "The Count of Monte Cristo", "type": "Movie"}
<class ‘str‘>

loads把字符串转换成数据类型

import json

get_info = json.loads(data)
print(get_info[‘name‘])
print(get_info)
print(type(get_info))

#输出
The Count of Monte Cristo
{‘name‘: ‘The Count of Monte Cristo‘, ‘type‘: ‘Movie‘}
<class ‘dict‘> 

2.dump序列化和load反序列化

dump把数据类型转换成字符串并存储在文件中

import json

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘
}

with open("test.txt", "w", encoding="utf-8") as f:
    json.dump(info, f)  # 第一个参数是内存中的数据对象,第二个参数是文件句柄

#写入文件中的内容
{"name": "The Count of Monte Cristo", "type": "Movie"}

load把文件打开从字符串转换成数据类型

import json

with open("test.txt", "r", encoding="utf-8") as f:
    data_from_file = json.load(f)

print(data_from_file[‘name‘])
print(data_from_file)
print(type(data_from_file))

#输出
The Count of Monte Cristo
{‘name‘: ‘The Count of Monte Cristo‘, ‘type‘: ‘Movie‘}
<class ‘dict‘>

  

3.json序列化一个函数

import json

def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

data = json.dumps(info)

#输出
 File "G:/python/untitled/study6/json&pickle模块.py", line 22, in <module>
    data = json.dumps(info)
  File "G:\python\install\lib\json\__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "G:\python\install\lib\json\encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "G:\python\install\lib\json\encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "G:\python\install\lib\json\encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable

1、json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。

2、json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式

 

三、pickle序列化

pickle的用法和上面的相同,但是pickle序列化后的数据类型是二进制的,并且pickle只能在python中是使用。

1.dumps && loads

import pickle

def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

data = pickle.dumps(info)
print(data)
print(type(data))

#输出
b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x19\x00\x00\x00The Count of Monte Cristoq\x02X\x04\x00\x00\x00typeq\x03X\x05\x00\x00\x00Movieq\x04X\x04\x00\x00\x00funcq\x05c__main__\ntest\nq\x06u.‘

<class ‘bytes‘>
import pickle

get_data = pickle.loads(data)
get_data[‘func‘](‘cat‘)
print(get_data)

#输出
hello,cat
{‘name‘: ‘The Count of Monte Cristo‘, ‘type‘: ‘Movie‘, ‘func‘: <function test at 0x00000235350A7F28>}

  

2. dump && load

import pickle

def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

with open(‘test.txt‘, ‘wb‘) as f:
    pickle.dump(info, f)

# 写入test.txt文件中的内容

?}q (X   typeqX   MovieqX   funcqc__main__
test
qX   nameqX   The Count of Monte Cristoqu.

  

import pickle

with open(‘test.txt‘, ‘rb‘) as f:
    get_data = pickle.load(f)
print(get_data)

# 输出

{‘name‘: ‘The Count of Monte Cristo‘, ‘func‘: <function test at 0x000001BA2AB4D510>, ‘type‘: ‘Movie‘}

  

总结:

  • json值支持简单的数据类型,pickle支持所有的数据类型。
  • pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  • pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
时间: 2024-11-03 22:12:31

json&pickle序列化的相关文章

python 跨语言数据交互,json,pickle(序列化).

Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类型]间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load json.dudmp ("[11,22]",open('db.txt','w'))   #转换成字符串再保存到该文件. json.lo

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

Json &amp; pickle 数据序列化

前提: 文本文件中只能写入字符串或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=op

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

一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种

Python学习心得(五) random生成验证码、MD5加密、pickle与json的序列化和反序列化

# -*- coding:utf-8 -*- import random as rd #验证码 import hashlib as hsl #MD5加密 import pickle,json #pickle与json序列化 #print rd.randint(1,5) #print help(range) #print help(rd.randint) #随机生成6位验证码: code = [] for i in range(1,7): if i == rd.randint(1,6): code

Python的json and pickle序列化

json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = { "name":"test", "age":"20", } #json序列化 with open("json_test","w",encoding="utf-8") a

6.python序列化功能之json&pickle

json模块是个非常重要的模块,可以实现任何语言之间跨平台的数据交换,还可以实现一些比较简单的数据类型的持久化.(这里的持久化就是说,把python内部一些比较简单的数据类型,比如说像字符串,列表,元组,字典之类的数据类型,转换为json字符串的标准格式,保存到硬盘中.) json模块常用函数: json.dumps():将python以字典为主的数据类型,包括(列表,元组,等)转换为json字符串. json.loads():将json字符串转换为python可识别的数据类型. json.du

Python之路-json和pickle序列化/反序列化

首先引入json模块 序列化:使用json的dumps方法 反序列化:使用json的loads方法 过程:在json序列化后就可以将序列化的数据类型写入文件,然后在从文件中读出该数据类型,然后在进行反序列化 json对象中的其他的方法:dump(info,f)>>>其中Info是需要序列化的数据,f是一个文件句柄:load(f)>>>使用这两个方法不要在对文件进行读写 pickle和json使用方法类似,只是名字不同且pickle可以处理复杂数据类型而json不能(pi