python--json和pickle序列化
2017-08-02 14:15
916 查看
字符串存储
一般需要有信息需要记录的都写到文件上面,把要记录的信息转成字符串,然后在写入到文件中。这算是一种记录方式。比如有一组用户信息需要存起来。数据定义好之后就可以写文件。
info = { 'name' : 'alex', 'age':22 } with open('test.txt','w')as f: f.write(str(info))
test.txt
{'name': 'alex', 'age': 22} # 这里当作字符串写进来了
读取信息就需要读文件了。
with open('test.txt','r',encoding='utf-8') as f: data = eval(f.readline()) print(data['name']) #alex
这种是要手动转下字符串,Python内置模块中还有一种序列化的方式。
json模块
json模块提供了数据序列化和反序列化的功能。先看下序列化之后的数据是什么格式的:
import json info = { 'name' : 'alex', 'age':22 } print(type(json.dumps(info)),[json.dumps(info)])#<class 'str'> ['{"name": "alex", "age": 22}']
可以看出来,序列化之后的数据是字符串类型的(放列表里面更容易看出来)。
既然是字符串,那么就可以写到文件里面。
写文件
import json #json模块 info = { 'name' : 'alex', 'age':22 } with open('test.txt','w')as f: f.write(json.dumps(info)) #序列化并写入文件
读文件
import json #加载json模块 with open('test.txt','r',encoding='utf-8') as f: data = json.loads(f.read()) #读文件并反序列化 print(data['name']) #alex
跟上面手动转字符串格式的效果一样,但是这种方法比上面上面那种更好。而且json的数据格式在很多语言中都通用。
虽然json比较通用,但是只能传递一些简单的数据。如果需要处理一些复杂的数据还有一个模块可以使用。
pickle模块
功能和json一样,也是可以序列化和反序列化数据的,但是pickle可以处理一些复杂的数据。不同的地方是 pickle序列化之后的数据是二进制格式的。
import pickle info = { 'name' : 'alex', 'age':22 } print(type(pickle.dumps(info)),[pickle.dumps(info)])#<class 'bytes'> [b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00alexq\x02X\x03\x00\x00\x00ageq\x03K\x16u.']
还用之前的例子处理一次。
写文件
import pickle info = { 'name' : 'alex', 'age':22 } with open('test.txt','wb')as f: #因为是二进制,所以是wb f.write(pickle.dumps(info)) #和json一样的方法
读文件
import pickle with open('test.txt','rb') as f: data = pickle.loads(f.read()) print(data['name']) #alex
pickle不仅可以序列化简单的数据结构,包括复杂的,比如函数、类等。
比如在上面的数据中加入一个函数。
写文件
import pickle def fun1(name): #这里定义了一个函数,并且把函数作为一个value,这里传递过去的应该是一个空间地址。 print('hello ',name) info = { 'name' : 'alex', 'age':22, 'fun':fun1 } with open('test.txt','wb')as f: f.write(pickle.dumps(info))
读文件
还是用之前的方式读import pickle with open('test.txt','rb') as f: data = pickle.loads(f.read()) print(data) #AttributeError: Can't get attribute 'fun1' on <module '__main__' from 'E:/pywww/day03/04.py'>
但是这里却给我报了一个错误。
把之前的函数拿过来。
import pickle def fun1(name): print('hello ',name) with open('test.txt','rb') as f: data = pickle.loads(f.read()) print(data) #{'name': 'alex', 'fun': <function fun1 at 0x00000000010F0048>, 'age': 22} print(data['fun']('alex')) #hello alex #None
这里并没有报错,而且函数还可以使用。 那这个函数的内容能不能被修改呢?
import pickle def fun1(name): print('hello2222 ',name) #这里打印的内容做了修改 with open('test.txt','rb') as f: data = pickle.loads(f.read()) print(data['fun']('alex')) #hello2222 alex #None
依然是可以的,两个程序中的内存地址是不可能一样的,那么序列化的内容就不是内存地址,而是整个数据对象。
另外,pickle中还有两个方法可以实现以上效果。dump和load,这两个方法与dumps和loads的区别就是把文件内容、文件句柄作为参数,可以不用写f.write()和f.read().
dump写文件
import pickle def fun1(name): print('hello ',name) info = { 'name' : 'alex', 'age':22, 'fun':fun1 } with open('test.txt','wb')as f: pickle.dump(info,f) #文件内容、句柄作为参数
load读文件
import pickle def fun1(name): print('hello2222 ',name) with open('test.txt','rb') as f: data = pickle.load(f) #句柄作为参数 print(data['fun']('alex')) #hello2222 alex #None
效果是一样的。
相关文章推荐
- Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块
- python基础6之迭代器&生成器、json&pickle数据序列化
- python 之序列化(pickle模块和json模块)
- Python--模块之sys模块、logging模块、序列化json模块、序列化pickle模块
- python3之序列化(pickle&json&shelve)
- Python序列化基础知识(json/pickle)
- Python模块:shutil、序列化(json&pickle&shelve)、xml
- python学习之路(json & pickle 模块 ---序列化,反序列化)
- 详解Python之数据序列化(json、pickle、shelve)
- Python 之 pickle/json序列化 之 2
- Python3. 4000 5——Json与pickle数据序列化
- day5-python中的序列化与反序列化-json&pickle
- Python序列化与反序列化——json和pickle
- Python-json与pickle数据序列化
- Python学习心得(五) random生成验证码、MD5加密、pickle与json的序列化和反序列化
- python序列化模块json和pickle
- python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
- python之路-14.Json & pickle 数据序列化
- Python之数据序列化(json、pickle、shelve)
- Python序列化模块json和pickle