Python:修改pickle对象

Python:修改pickle对象,python,pickle,Python,Pickle,我正在使用cPickle存储对象。稍后我想修改个人记录。不幸的是,文件在修改后被损坏(我得到了UnpicklingError): 制作和腌制 拆开并修改 我不确定,但在我看来,由于您已经有一个books对象列表(从文件加载),因此,如果您将使用该列表的上下文重写文件(您可以删除所需的记录,或者简单地使用dump来删除books[I]=new),而不是试图找到一个用于插入新记录的文件夹,那么您将更容易且无错误 换句话说,请尝试以下方法: class Book(object): def _

我正在使用cPickle存储对象。稍后我想修改个人记录。不幸的是,文件在修改后被损坏(我得到了UnpicklingError):

制作和腌制 拆开并修改
我不确定,但在我看来,由于您已经有一个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()