Python学习笔记(二)json和pickle

json和pickle

序列化

我们把对象(变量)从内存中变成可储存或传输的过程称为序列化,在Python中叫pickling,在其他语言中也被称为serialiazation, marshalling, flattening。比如一个字典类型的变量是不能直接写入文件的,需要先转为字符串再写入文件。
序列化之后可以把序列化后的内容写入磁盘,或者通过网络传输到其他机器上。反过来把变量内容从序列化的对象重新读到内存称之为反序列化,即unpickling。

json

如果在不同的编程语言中传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,JSON表达出来是一个字符串,可以被所有语言读取,也方便存储和传输。JSON不仅是标准格式,比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象。

来看下面的例子,把一个字典写入txt文件:

import json

dict = {'name': 'Meng', 'age': '20'}

data = json.dumps(dict) # 序列化过程
f = open('json_test.txt', 'w')

f.write(data)
f.close()

打开json_test.txt,可以看到{"name": "Meng", "age": "20"},从txt文件取出字典的过程是这样的:

import json

f = open('json_test.txt', 'r')
data = f.read()
data = json.loads(data) # 反序列化过程

print(data['name']) # 'Meng'
f.close()

JSON支持对绝大部分基本数据类型的序列化,但是对于函数这些比较复杂的数据类型是不支持的。

JSON的dump和load方法是与dumps和loads的功能是完全相同的,只不过在调用时参数不同:

# data = json.dumps(dict)
# f.write(data)
json.dump(dict, f)


# data = f.read()
# data = json.loads(data)
data = json.load(f)

pickle

pickle只能用于python之间传输。下面用pickle把函数写入txt文件:

import pickle

def func():
    print('function')

data = pickle.dumps(func)
f = open('pickle_test.txt', 'wb') # 转换为二进制,所以改为'wb'的写入方式

f.write(data)
f.close()

打开pickle_test.txt,由于是二进制打开是乱码,所以pickle相对于json不容易理解。pickle取出函数的过程如下:

import pickle

# 要注意写入文件的实际上只是函数的内存地址,所以读出时也要有func的定义才是合法的,在两台电脑传输过程中,必须都有func的定义才行
def func():
    print('function')

f = open('pickle_test.txt', 'rb')
data = f.read()

data = pickle.loads(data)
data()
f.close()

shelve

shelve模块很简单,只有一个open函数,返回一个类似字典的可读可写对象,key必须是字符串,value可以是python支持的其他数据类型:

import shelve


f = shelve.open(r'SHELVE_test.txt')
f['stu1'] = {'name': 'Meng', 'age': '20'}
f['stu2'] = {'name': 'Lu', 'age': '19'}

print(f.get('stu1')) # {'name': 'Meng', 'age': '20'}

f.close()

猜你喜欢

转载自blog.csdn.net/qq_37876210/article/details/82631802