Python:修改pickle对象
我正在使用cPickle存储对象。稍后我想修改个人记录。不幸的是,文件在修改后被损坏(我得到了UnpicklingError): 制作和腌制 拆开并修改Python:修改pickle对象,python,pickle,Python,Pickle,我正在使用cPickle存储对象。稍后我想修改个人记录。不幸的是,文件在修改后被损坏(我得到了UnpicklingError): 制作和腌制 拆开并修改 我不确定,但在我看来,由于您已经有一个books对象列表(从文件加载),因此,如果您将使用该列表的上下文重写文件(您可以删除所需的记录,或者简单地使用dump来删除books[I]=new),而不是试图找到一个用于插入新记录的文件夹,那么您将更容易且无错误 换句话说,请尝试以下方法: class Book(object): def _
我不确定,但在我看来,由于您已经有一个books对象列表(从文件加载),因此,如果您将使用该列表的上下文重写文件(您可以删除所需的记录,或者简单地使用dump来删除books[I]=new),而不是试图找到一个用于插入新记录的文件夹,那么您将更容易且无错误 换句话说,请尝试以下方法:
class Book(object):
def __init__(self, title, author, ISBN, price):
self.title = title
self.author = author
self.ISBN = ISBN
self.price = price
def __str__(self):
rep = self.title+" by "+self.author+".\n"
rep += "ISBN: "+self.ISBN+"\n"
rep += "Price: "+str(self.price)
return rep
def main():
from cPickle import load, dump
print "Loading..."
books = [load(line) for line in open("books.dat", "rb")]
print "Load complete."
rec = int(raw_input("Record to delete: "))
title = "New"
author = "New"
ISBN = "New"
price = 0
books[rec] = Book(title, author, ISBN, price) # replace previous record
with open("books.dat", "wb") as f:
for record in books:
dump(record, f)
main()
确切的错误是什么?无论如何,您可以尝试使用现在内置的sqlite3模块。如果必须这样做的话,这也将提供一个到真实数据库的更简单的迁移路径。回溯(最后一次调用):文件“/Users/aed0101/Dropbox/QSAP/cPickle/unpack.py”,第49行,在main()文件“/Users/aed0101/Dropbox/QSAP/cPickle/unpack.py”,第27行,在main book=load(f)UnpicklingError:invalid load key,我已经试过sqlite3了。我将使用它。非常感谢。谢谢我试着不重写它。getsizeof似乎没有报告正确的大小。@aeed0101-不确定在这种情况下使用seek、getsizeof等是否会给您带来好处。
class Book(object):
def __init__(self, title, author, ISBN, price):
self.title = title
self.author = author
self.ISBN = ISBN
self.price = price
def __str__(self):
rep = self.title+" by "+self.author+".\n"
rep += "ISBN: "+self.ISBN+"\n"
rep += "Price: "+str(self.price)
return rep
def main():
from cPickle import load
from cPickle import dump
import sys
books = []
EOF = False
f = open("books.dat", "r+b")
print "Loading..."
while not EOF:
try:
book = load(f)
except(EOFError):
EOF = True
else:
books.append(book)
print "Load complete."
rec = int(raw_input("Record to delete: "))
print books[rec]
fwd = 0
for i in range(rec):
fwd+= sys.getsizeof(books[i])
print str(fwd)
title = "New"
author = "New"
ISBN = "New"
price = 0
new = Book(title, author, ISBN, price)
print str(sys.getsizeof(new))
f.seek(fwd)
dump(new, f)
f.close()
main()
class Book(object):
def __init__(self, title, author, ISBN, price):
self.title = title
self.author = author
self.ISBN = ISBN
self.price = price
def __str__(self):
rep = self.title+" by "+self.author+".\n"
rep += "ISBN: "+self.ISBN+"\n"
rep += "Price: "+str(self.price)
return rep
def main():
from cPickle import load, dump
print "Loading..."
books = [load(line) for line in open("books.dat", "rb")]
print "Load complete."
rec = int(raw_input("Record to delete: "))
title = "New"
author = "New"
ISBN = "New"
price = 0
books[rec] = Book(title, author, ISBN, price) # replace previous record
with open("books.dat", "wb") as f:
for record in books:
dump(record, f)
main()