扁平文件
普通文件的创建
with open('data.txt', 'w', encoding='utf8') as f: # 使用上下文方式创建一个文件
f.write('小鸟\n') # 写内容
f.write('网络科技') # 写内容
用文本文件存储对象
scores = [88, 99, 65, 80]
def write_scores():
with open('data_list.txt', 'w', encoding='utf8') as f:
f.write(str(scores)) # 写内容 把列表转换成字符串类型写入到data_list.txt文件里
print('成功写入文件...')
def read_scores():
with open('data_list.txt', 'r', encoding='utf8') as f:
# lst = f.read() # 读取的是字符串 '[88, 99, 65, 80]'
# lst = list(f.read()) # 会把每一个字符都转换成列表的一个值,包括括号 空格 逗号等
lst = eval(f.read()) # 用eval直接把传递过来的字符串转换成Python表达式
lst[0] = 77 # 更改列表的第一个值
print(lst) # [77, 99, 65]
用文本方式存储对象比较不方便 繁琐,只适合存储普通文件
存储持久化对象用pickle
pickle
import pickle
p = {'name': 'Tom', 'age': 20}
序列化为字符串
s = pickle.dumps(p) # .dumps(obj):将对象序列化为字符串
print(s) # 返回的是没有任何实际意义的二进制文件
p = pickle.loads(s) # .loads(s):从字符串反序列化对象
print(p) # 输出的是字典表 {'name': 'Tom', 'age': 20}
序列化对象到文件
pickle.dump(p, open('pickle_db', 'wb')) # 用pickle新建一个二进制文件 并写入p这个字典表
p = pickle.load(open('pickle_db', 'rb')) # 用pickle反序列化这个文件 赋给句柄p
print(p) # 输出的是字典表 {'name': 'Tom', 'age': 20}
shelve
更强大 支持自定义类型实例对象 比较方便好用
import shelve
scores = [99, 55, 66]
student = {'name': 'Mike', 'age': '20'}
存储
db = shelve.open('shelve_student')
# 不用指定名称 读写 二进制什么的直接就创建二进制文件了 只要一个参数:open('dbfile')
db['s1'] = student # 通过键值赋值 把student给db key为s1 db['key'] = obj
db['s2'] = scores # 把分数也给他 把scores 给db key为s2 db['key'] = obj
print(len(db)) # 有两个键值
读取
temp_student = db['s1'] # 直接通过键值读取
print(temp_student)
# 读取后的类型依然是序列化之前的对象类型
print(type(temp_student)) # 通过type检查类型 依然是序列化之前的字典表类型
删除
print(db['s2']) # 读取 访问 打印 s2
del db['s2'] # 删除一个键值 del db['key']
print(len(db)) # 这个时候就len就是1了
序列化自定义类型实例
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
db['s'] = s # 把实例化后的对象s赋值给db key为s
print(len(db)) # 有一个键值 len(db)
db.close() # 保险起见 关闭一下文件 shelve自带的方法 .close()
# 读取
def read_shelve():
db = shelve.open('shelve_student_db') # 打开文件 赋值句柄给db
st = db['s'] # 把db['s']的值取出来给st
print(st) # 打印的结果是上面__str__返回的name
print(st.name) # 相当于self.name
print(st.age) # 相当于self.age