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