鱼C论坛

 找回密码
 立即注册
查看: 1950|回复: 5

[已解决]关于 pickle的用法

[复制链接]
发表于 2020-4-18 14:28:17 | 显示全部楼层 |阅读模式

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

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

x
import pickle as p
import os
class MyDes:
    def __init__(self,data = 0, string = ''):
        self.data = data
        self.string = string
        
    def __get__(self,instance,owner):
        filename = 'C:/Users/user/Desktop/{0}.pkl'.format(self.string)
        self.f=open(filename,'wb')
        p.load(filename)
        self.f.close()
        return self.data

    def __set__(self,instance,value):
        filename = 'C:/Users/user/Desktop/{0}.pkl'.format(self.string)
        self.f=open(filename,'wb')
        self.data = value
        p.dump(value, filename)
        self.f.close()

    def __delete__(self,instance):
        filename = 'C:/Users/user/Desktop/{0}.pkl'.format(self.string)
        os.remove(filename)

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


代码是这样的,就是第46讲课后练习的最后一刻,
然后
test=Test()
test.x=10
然后这边一直报错,报错类型是
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    test.x=10
  File "C:\Users\user\Desktop\新建文本文档.py", line 19, in __set__
    p.dump(value, filename)
TypeError: file must have a 'write' attribute

我不理解的是,我已经把文件用‘wb’的方式打开了,为什么这个文件无法导入数据呢,有没有大佬解答一下的
最佳答案
2020-4-18 17:23:40
应该要传递文件对象给 dump(),而不是文件名:
    def __set__(self,instance,value):
        filename = 'C:/Users/user/Desktop/{0}.pkl'.format(self.string)
        self.f=open(filename,'wb')
        self.data = value
        p.dump(value, self.f)
        self.f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-18 14:40:14 | 显示全部楼层
Python的open和pickle应该不共用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 15:29:14 | 显示全部楼层
qiuyouzhi 发表于 2020-4-18 14:40
Python的open和pickle应该不共用

def __set__(self, instance, value):
        with open(self.filename, 'wb') as f:
            pickle.dump(value, f)
            MyDes.saved.append(self.name)

这是小甲鱼写的代码,这样写就不算open和pickle共用吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 15:30:43 | 显示全部楼层
雨谷 发表于 2020-4-18 15:29
def __set__(self, instance, value):
        with open(self.filename, 'wb') as f:
            pic ...

你倒是把文件对象传进dump的参数里啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 17:23:40 | 显示全部楼层    本楼为最佳答案   
应该要传递文件对象给 dump(),而不是文件名:
    def __set__(self,instance,value):
        filename = 'C:/Users/user/Desktop/{0}.pkl'.format(self.string)
        self.f=open(filename,'wb')
        self.data = value
        p.dump(value, self.f)
        self.f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 21:06:15 | 显示全部楼层
zltzlt 发表于 2020-4-18 17:23
应该要传递文件对象给 dump(),而不是文件名:

哦哦,原来问题在这里,多谢多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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