python 序列化模块

一、介绍

1、分类

序列化:

数据类型->字符串

反序列化

字符串->数据类型

2、作用

文件传输和文件储存需要将数据类型转换成字符串

二、序列号模块分类

1、json

优点:编程语言中的英语,同用语言

缺点:数据类型少:数字、字符串、列表、字典、元祖(通过列表进行的)

2、pickle

优点:python的所有数据类型

缺点:不通用,只能在python中使用

3、shelve

优点:操作简单,只要使用序列化句柄操作即可

缺点:不成熟

三、json模块

1、dumps() 和 loads() 方法

import json
dic = {'k1': 'v1'}
"""
dic->str,使用dumps()方法,在内存中序列化
str->dic,使用loads()方法,在内存中反序列化
"""
str_d = json.dumps(dic)
print(str_d, type(str_d))
dic_d = json.loads(str_d)
print(dic_d, type(type))
"""
结果:
{"k1": "v1"} <class 'str'>
{'k1': 'v1'} <class 'type'>
"""

2、dump() 和 load() 方法

import json
dic = {'k1': 'v1'}
"""
json.dump(数据, 文件),序列化
json.load(文件),反序列化
"""
with open(file='abc', mode='w', encoding='utf-8') as f1:
    json.dump(dic, f1)

with open(file='abc', mode='r', encoding='utf-8') as f1:
    ret = json.load(f1)print(ret, type(ret))   # {'k1': 'v1'} <class 'dict'>

3、在文件中,一行一行序列化,一行一行反序列化,必须用dumps()和loads()方法

import json
li = [{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}]
new_li = []
"""
1.使用dumps()方法,li->str,并写入文件-逐行写入
2.使用loads()方法,str->li,并读取文件-逐行读取
"""
f = open('cv', mode='w', encoding='utf-8')
for i in li:
    s = json.dumps(i)
    f.write(s + '\n')
f.close()
f1 = open('cv', mode='r', encoding='utf-8')
for line in f1:
    s0 = json.loads(line.strip())
    new_li.append(s0)
print(li)
f.close()

ensure_ascii 默认参数为 False时,可以写中文

四、pickle模块

1、用法和json模块相似

2、区别

1)在使用dump()和load()方法,序列化和反序列化时,文件的mode要加b

2)在使用dump()和load()方法时,文件可以逐行序列化和反序列化,json不可以

import pickle
import time
s_time1 = time.localtime(1000000000)
s_time2 = time.localtime(2000000000)
f = open('pickle_file1', 'wb')
pickle.dump(s_time1, f)
pickle.dump(s_time2, f)
f.close()
f = open('pickle_file1', 'rb')
s_time1 = pickle.load(f)
s_time2 = pickle.load(f)
print(s_time1.tm_year)
print(s_time2.tm_year)
f.close()

五、shelve模块

 不常用

import shelve
f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'}  # 直接对文件句柄操作,就可以存入数据
f.close()

f1 = shelve.open('shelve_file')
existing = f1['key']  # 取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)

 ps:涉及到反序列化的问题,用双引号

posted @ 2019-05-20 22:48  市丸银  阅读(134)  评论(0编辑  收藏  举报