访问列表的“内部变量”

时间:2015-03-23 13:12:48

标签: python python-2.7 data-structures io

我创建了一个列表的子类,每隔一段时间写入文件,这样即使发生灾难性故障,我也可以恢复数据。但是,我不确定我是否以最佳方式处理IO。

import cPickle

class IOlist(list):
    def __init__(self, filename, sentinel):
        list.__init__(self)
        self.filename = filename
    def save(self):
        with open(self.filename, 'wb') as ouf:
            cPickle.dump(list(self), ouf)
    def load(self):
        with open(self.filename, 'rb') as inf:
            lst = cPickle.load(inf)
        for item in lst:
            self.append(item)

在我读入文件后,将每个对象逐个添加回列表中会感觉不对。有一个更好的方法吗?我希望您可以访问列表对象的内部并执行类似

的操作
    def load(self):
        with open(self.filename, 'rb') as inf:
            self.list_items = cPickle.load(inf)

不幸的是,vars(list)似乎表明该列表没有__dict__属性,而且我也不知道在哪里可以查找列表项目的存储位置。

我尝试了self = cPickle.load(inf),但这也无效。

3 个答案:

答案 0 :(得分:4)

您应该可以使用

将pickle直接加载到列表中
def load(self):
    with open(self.filename, 'rb') as inf:
        self[:] = cPickle.load(inf)

另一个观察结果是,如果在保存期间出现问题,您可能会删除最新的持久列表,不会有任何恢复方法。最好使用单独的文件(可能使用临时文件或类似文件,或只管理2个文件),然后在确定列表已成功保留后替换以前的文件。

答案 1 :(得分:2)

您可以使用extend()来加载未填充的列表:

self.extend(cPickle.load(inf))

答案 2 :(得分:2)

您实际上想要将当前列表的全部内容替换为已加载的内容。为此你可以使用切片:

self[:] = lst