江湖道

庙堂,江湖,学术!

返回顶部

Python 序列化与反序列化

很多程序都需要用户输入某种信息,如让用户存储游戏首页项或者提供可视化的数据。不管是专注什么,程序员都会把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息:一种简单的方式就是使用.json来存储数据。

json模块让你能够将简单的python数据结构转存到文件中,并在程序再次运行时加载该文件中的数据。

你还可以使用json在python程序之间分享数据。

更为重要的是,Json数据格式并非python专用,这让你能够将json格式存储的数据与使用其他编程语言的人分享,或其他编程语言调用。

Json:(JavaScript Object Notation)格式最初是为javascript开发的,但后来成了一种常见的格式,包括python在内的众多语言采纳。

1.  使用json.dump()和json.load()

#Author:Anliu
import json
number = [2,3,4,5,67,8,9]

filename = "numbers.json"
with open("filename","w") as f_obj:
    json.dump(number,f_obj)

我们看存到文件的数据表格式和我们在python中的是一样的。

[2, 3, 4, 5, 67, 8, 9]

在编写下一个程序。使用json.load()将这个列表读取到内存中。

#Author:Anliu
import json
filename = "numbers.json"
with open("filename","r") as f_obj:
    numbers = json.load(f_obj)
print(numbers)

同样可以读取到列表。这样在程序之间实现了数据共享。

2. 序列化和反序列化的定义

  • 序列化:就是把不可传输的对象转换为可存储或可传输的过程
  • 反序列化:就是把在磁盘,等介质中的数据转换为对象

python中序列化通常有两种方式:pickle模块和json模块

2.1 pickle模块的使用


对于大多数应用程序来讲,dump()和load()函数的使用就是你使用pickle模块所需的全部了。
dumps(object)和dump(object) :序列化
loads(bytes)和load(bytes):反序列化
两者不同的是不带s的是(反)序列化关于二进制文件中,带s是(反)关于序列化对象

#Author:Anliu
import pickle
dict = {"hostname":"zabbix",
        "IP":"192.168.42.111"
        }
print(dict,type(dict))
#with open("file_p","wb") as f:
m = pickle.dumps(dict)
print(m,type(m))
n = pickle.loads(m)
print(n,type(n))

pickle.dump和pickle.load的使用:序列和反序列化到文件中的

#Author:Anliu
import pickle
dict = {"hostname":"zabbix",
        "IP":"192.168.42.111"
        }
print(dict,type(dict))
with open("test_p1","wb") as f1:
    m = pickle.dump(dict,f1)

with open('test_p1',"rb") as f2:
    n = pickle.load(f2)
    print(n,type(n))

序列化函数:

#Author:Anliu
import pickle
def logging():
    print("This is a test of logging")

m = pickle.dumps(logging)
print(m,type(m))

n = pickle.loads(m)
print(n,type(n))
n()


2.2 json模块的使用

方法不带s的是file文件中使用的
json.dumps 从字典(可序列化json的对象)转换为json格式数据
json.loads 从json到字典
json.dump
json.load
default:就是把任意一个对象变成一个可序列为JSON的对象
intent:格式化好看点

#Author:Anliu
import json
dict = {"hostname":"zabbix",
        "IP":"192.168.42.111"
        }

print(dict,type(dict))
#with open("test_j1","w") as f:
m = json.dumps(dict,indent=4)
print(m,type(m))

n = json.loads(m)
print(n,type(n))

输出结果:
{'hostname': 'zabbix', 'IP': '192.168.42.111'} <class 'dict'>
{
    "hostname": "zabbix",
    "IP": "192.168.42.111"
} <class 'str'>
{'hostname': 'zabbix', 'IP': '192.168.42.111'} <class 'dict'>


序列化可调运的数据类型:

#Author:Anliu
import json
class Ball:
    def __init__(self, color):
        self.color = color

ball = Ball("red")

def ball2idict(bal):
    return {
        "color": bal.color
    }

def dict2ball(odict):
    return Ball(odict["color"])

objdumps = json.dumps(ball, default=ball2idict)
objloads = json.loads(objdumps, object_hook=dict2ball)
print(objdumps)
print(objloads)


posted @ 2020-04-06 23:07  大江东流水  阅读(330)  评论(0编辑  收藏  举报