【问题标题】:Accessing "internal variables" of list访问列表的“内部变量”
【发布时间】:2015-03-23 13:12:47
【问题描述】:

我创建了一个列表的子类,它每隔一段时间就写入文件,这样即使发生灾难性故障,我也可以恢复数据。但是,我不确定我是否以最佳方式处理 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),但也没有用。

【问题讨论】:

  • list 对象是用 C 编码的,您需要访问 C 结构来直接分配元素。你不想去那里。
  • 您确定要将已读项目附加到列表中吗?你不想替换现有的内容吗?

标签: python python-2.7 data-structures io


【解决方案1】:

您应该能够使用

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

另一个观察结果是,如果在保存过程中出现问题,您可能会删除最新的持久列表,而无法恢复。您最好使用单独的文件(可能使用 tempfile 或类似文件,或者只管理 2 个文件),然后在确定列表已成功保存后替换以前的文件。

【讨论】:

    【解决方案2】:

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

    self.extend(cPickle.load(inf))
    

    【讨论】:

      【解决方案3】:

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

      self[:] = lst
      

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2011-06-15
        • 2014-01-03
        • 2017-01-19
        • 2016-11-22
        • 1970-01-01
        相关资源
        最近更新 更多