python基础

18.python序列化

2019-01-23  本文已影响0人  花间派I风月

1. 基础概念


2. json

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的

dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}


list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) 
#<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2)
 #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)
import json
f = open('file','w')
json.dump({'国籍':'中国'},f)
ret = json.dumps({'国籍':'中国'})
f.write(ret+'\n')
json.dump({'国籍':'美国'},f,ensure_ascii=False)
ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
f.write(ret+'\n')
f.close()
import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
print(json_dic2)

3. pickle

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  #一串二进制内容

dic2 = pickle.loads(str_dic)
print(dic2)    #字典

import time
struct_time1  = time.localtime(1000000000)
struct_time2  = time.localtime(2000000000)
print(struct_time1)
print(struct_time2)
f = open('pickle_file','wb')
pickle.dump(struct_time1,f)
pickle.dump(struct_time2,f)
f.close()

f = open('pickle_file','rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)
f.close()

4. shelve

import shelve


def member_info(name, age):
    print('Member info:', name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name': 'Pumpkin', 'age': 20}

with shelve.open('shelve_demo') as data:
    data['name'] = name
    data['info'] = info
    data['func'] = member_info

def member_info(name, age):
    print('Member info:', name, age)


with shelve.open('shelve_demo') as data:
    print(data['name'])
    print(data['info'])
    print(data['func']('Alex', 22))

# 结果输出:
['Jack', 'Pumpkin', 'Tom']
{'name': 'Pumpkin', 'age': 20}
Member info: Alex 22
None
def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}

with shelve.open('shelve_demo') as data:
    data['name'] = name
    data['info'] = info
    data['name'].append('Alex')
    print(data['name'])

输出:
['Jack', 'Pumpkin', 'Tom']   # 第一次赋值后apend的元素并没有生效

再次open打开结果也是这样:

import shelve

def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}


with shelve.open('shelve_demo') as data:
    print(data['name'])

造成上述情况的原因是:我们只是修改了shelve对象的副本,而它并木有被最终保存。此时我们除了下文要讲述的update方法外,还有以下两种方法:

方法一: shelve open一个对象后,先用临时变量指向对象副本,在临时变量上修改后让对象副本再次指向临时变量,从而覆盖保存对象副本。这种方法的本质是对open后的对象重新赋新值,并非在原有基础上进行update,也就是open后的对象内存指向地址发生了变化。

import shelve

def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}

with shelve.open('shelve_demo') as data:
    data['name'] = name
    data['info'] = info
    temp = data['name']   # 这里的关键点在于对临时变量的使用
    temp.append('Alex')
    data['name'] = temp
    print(data['name'])

输出:
['Jack', 'Pumpkin', 'Tom', 'Alex']

方法二:借助open的writeback=True参数来实现,默认情况下该参数的值为False。

import shelve

def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}

with shelve.open('shelve_demo', writeback=True) as data:
    data['name'] = name
    data['info'] = info
   data['name'].append('Alex')
    print(data['name'])

输出:
['Jack', 'Pumpkin', 'Tom', 'Alex']

import shelve

def member_info(name, age):
   print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}

with shelve.open('shelve_demo', writeback=True) as data:
    data['name'] = name
    data['info'] = info
    data.update({'name':['Jack', 'Pumpkin', 'Tom', 'Alex']})  # 这里也是重新赋值
    print(data['name'])

输出:
['Jack', 'Pumpkin', 'Tom', 'Alex']

重新load一下看看结果:

import shelve

def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}


with shelve.open('shelve_demo') as data:
    print(data['name'])

输出:
['Jack', 'Pumpkin', 'Tom', 'Alex']

import shelve

def member_info(name, age):
    print("Member info:", name, age)

name = ['Jack', 'Pumpkin', 'Tom']
info = {'name':'Pumpkin', 'age':18}


with shelve.open('shelve_demo') as data:
    print(data.get('name'))

输出:
['Jack', 'Pumpkin', 'Tom', 'Alex']

5. 总结

1、需要与外部系统交互时用json模块;

2、需要将少量、简单Python数据持久化到本地磁盘文件时可以考虑用pickle模块;

3、需要将大量Python数据持久化到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时,可以考虑用shelve模块。

上一篇 下一篇

猜你喜欢

热点阅读