Python基础:对象持久化

扁平文件

普通文件的创建

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值