python3--序列化

序列化:将其他数据类型的数据转换为字符串类型---------类似于使用str(...)

反序列化:将字符串类型的数据转换为其他数据类型的数据-----------类似于使用eval(str),但字符串str被当成有效的表达式来求值并返回计算结果,存在极大的安全隐患。

1.json(字符串和python数据类型间进行转换,多种语言通用,应用范围广)

  • 操作普通类型数据--序列化dumps,反序列化loads
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}
  • 操作文件句柄--序列化dump,反序列化load
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特有,并不通用)

  • 操作普通类型数据--序列化dumps,反序列化loads
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': '男'}
  • 操作文件句柄--序列化dump,反序列化load
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()

你可能感兴趣的:(python)