序列化:将其他数据类型的数据转换为字符串类型---------类似于使用str(...)
反序列化:将字符串类型的数据转换为其他数据类型的数据-----------类似于使用eval(str),但字符串str被当成有效的表达式来求值并返回计算结果,存在极大的安全隐患。
1.json(字符串和python数据类型间进行转换,多种语言通用,应用范围广)
import json
dic = {'name':'tom','age':24}
ret = json.dumps(dic)
print(type(ret),ret) # {"name": "tom", "age": 24}
dic2 = json.loads(ret)
print(type(dic2),dic2) # {'name': 'tom', 'age': 24}
import json
# 序列化--将一个字典数据写到test.txt文件中
with open('test.txt','w') as f:
json.dump({'name':'json','sex':'男'}, f ,ensure_ascii=False) # 默认情况下ensure_ascii=True,所有非ASCII码字符显示为\uXXXX
# 反序列化--将文件中的信息,转化为字典
with open('test.txt') as f:
ret = json.load(f)
print(type(ret),ret) # {'name': 'json', 'sex': '男'}
2.pickle(字符串二进制和python的数据类型间进行转换,python特有,并不通用)
import pickle
pd = pickle.dumps({'name':'json','sex':'男'})
print(type(pd),pd) # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00jsonq\x02X\x03\x00\x00\x00sexq\x03X\x03\x00\x00\x00\xe7\x94\xb7q\x04u.'
ret = pickle.loads(pd)
print(type(ret),ret) # {'name': 'json', 'sex': '男'}
import pickle
with open('test.txt','wb') as f:
pickle.dump({'name':'json','sex':'男'}, f) # 二进制的形式写入文件中
# 反序列化--将文件中的信息,转化为字典
with open('test.txt','rb') as f:
ret = pickle.load(f)
print(type(ret),ret) # {'name': 'json', 'sex': '男'}
3.shelve
将数据存入文件中,需要时像字典一样读取。数据存储在生成的三种文件中(.dat、.bak、.dir),其中.dat存放的是内容,.dir存放的是key,.bak是.dir的备份。
import shelve
s = shelve.open('shelvetest.db')
s['k'] = {'name':'uou','sex':'男'}
s.close()
# 在原有内容中修改值,需要设置writeback=True,否则修改无效
s = shelve.open('shelvetest.db')
s['k']['height'] = '180'
print(s['k']) # {'name': 'uou', 'sex': '男'}
s.close()
# writeback=True 会将所有从文件中读取的对象放到缓存。close()时,缓存中所有的对象会被重新写入文件中。(增加了内存消耗)
s = shelve.open('shelvetest.db',writeback=True)
s['k']['height'] = '180'
print(s['k']) # {'name': 'uou', 'sex': '男', 'height': '180'}
s.close()
# 重新赋值,不需要设置writeback=True
s = shelve.open('shelvetest.db')
s['k'] = 'this is the new word'
print(s['k']) # this is the new word
s.close()