Python对象持久化
使用eval()函数
scores = [66, 77, 88, 99]
def write_scores():
with open('data_list.txt', 'w', encoding='utf8') as f:
f.write(str(scores))
def read_scores():
with open('data_list.txt', 'r', encoding='utf8') as f:
lst = eval(f.read())
print(lst)
if __name__ == '__main__':
write_scores()
read_scores()
输出:
[66, 77, 88, 99]
eval()函数能将字符串转换成python的表达式
使用pickle模块
>>> import pickle
>>> person = {'name':'Tom', 'age':20}
# 将对象序列为字符串
>>> s = pickle.dumps(person)
>>> s
b'\x80\x04\x95\x1a\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x14u.'
# 从字符串反序列化对象
>>> p = pickle.loads(s)
>>> p
{'name': 'Tom', 'age': 20}
>>> type(p)
<class 'dict'>
使用dumps()方法和loads()方法,将对象序列化为字符串和从字符串反序列化对象
>>> person = {'name':'Tom', 'age':20}
# 以二进制形式将字典表对象写入文件
>>> pickle.dump(person, open('pickle_db', 'wb'))
# 以二进制形式读取文件,还原对象
>>> p = pickle.load(open('pickle_db', 'rb'))
>>> p
{'name': 'Tom', 'age': 20}
>>> type(p)
<class 'dict'>
使用dump()方法和load()方法,将对象序列化为文件和从文件反序列化对象
使用shelve模块
>>> import shelve
>>> scores = [77, 88, 99]
>>> student = {'name':'Mike', 'age':20}
# 创建文件准备保存多个对象
>>> db = shelve.open('shelve_student')
# 将不同对象序列化为文件,并以不同键值标记
>>> db['s'] = student
>>> db['scores'] = scores
>>> len(db)
2
>>> db['s']
{'name': 'Mike', 'age': 20}
>>> type(db['s'])
<class 'dict'>
>>> db['scores']
[77, 88, 99]
# 删除某个对象
>>> del db['scores']
>>> len(db)
1
将多个对象序列化为文件时可以使用shelve模块
import shelve
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name
def write_shelve():
s = Student('Tom', 20)
db = shelve.open('shelve_student_db')
db['s'] = s
db.close()
def read_shelve():
with open('data_list.txt', 'r', encoding='utf8') as f:
db = shelve.open('shelve_student_db')
st = db['s']
print(st)
print(st.name)
print(st.age)
db.close()
if __name__ == '__main__':
write_shelve()
read_shelve()
输出:
Tom
Tom
20
将自定义类型的对象序列化为文件也可以使用shelve模块