鱼C论坛

 找回密码
 立即注册
查看: 1647|回复: 6

[已解决]46讲最后一题

[复制链接]
发表于 2020-11-11 11:52:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
'''编写描述符 MyDes,使用文件来存储属性,属性的值会直接存储到对应的pickle(腌菜,还记得吗?)的文件中。如果属性被删除了,文件也会同时被删除,属性的名字也会被注销'''
import pickle as p
import os

class MyDes:
    def __init__(self,attr):
        self.attr_name = attr
        self.attr = attr
        pickle_file =  open(('D:\\python代码库\\属性值\\%s.pkl'% self.attr_name),'ab')  
        p.dump(self.attr,pickle_file)
        pickle_file.close()

    def __get__(self,instance,owner):
        return self.attr

    def __set__(self,instance,value):
        '''保存属性的值写入到plk文件,但是无法正常写入文件,初次能写入,第二次写入无效,还是原来那样''
        self.attr = value
        pickle_file =  open(('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name),'ab')    #打开属性对应的文件
        p.dump(value, pickle_file)
        pickle_file.close()
        print('写入')

    def __delete__(self,instance):
        try:
            os.remove('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name)
            del instance.x
        except FileNotFoundError:
            pass

class Test:
    x = MyDes('x')
    y = MyDes('y')
    s = 123

t = Test()

del t.x
t.y = '123'  
f = open("D:\\python代码库\\属性值\\y.pkl",'rb')
s = p.load(f)
print(s)

’问题:当我修改属性的值时候,读取pkl文件,文件内容并没有发生改变,求解‘’‘
最佳答案
2020-11-11 13:52:11
init和set都用wb模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-11 13:52:11 | 显示全部楼层    本楼为最佳答案   
init和set都用wb模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 13:58:56 | 显示全部楼层

    def __set__(self,instance,value):
        '''保存属性的值写入到plk文件,但是无法正常写入文件,初次能写入,第二次写入无效,还是原来那样''
        self.attr = value
        p.clear_memo()   #加上这个试试
        pickle_file =  open(('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name),'ab')    #打开属性对应的文件
        p.dump(value, pickle_file)
        pickle_file.close()
        print('写入')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-11 14:05:57 | 显示全部楼层
笨鸟学飞 发表于 2020-11-11 13:58
def __set__(self,instance,value):
        '''保存属性的值写入到plk文件,但是无法正常写入文件 ...

加了直接报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-11 14:09:43 | 显示全部楼层

问题解决了,有个小疑惑为什么ab模式第二次写入无效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 20:54:07 | 显示全部楼层
qin_yin 发表于 2020-11-11 14:09
问题解决了,有个小疑惑为什么ab模式第二次写入无效

我理解pickle存的是python原生对象,不能像写文本数据那样直接追加。
想追加得先读出数据,对数据操作后,再存入文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 21:02:38 | 显示全部楼层
用这个验证一下追加:
import pickle

with open('test.pkl', 'wb') as f:
    pickle.dump([1, 2, 3, 4], f)

with open('test.pkl', 'ab') as f:
    pickle.dump([5, 6], f)

with open('test.pkl', 'rb') as f:
    print(pickle.load(f))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-12 21:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表