UnpicklingError:在尝试从搁置文件中读取字典时,pickle数据被截断

时间:2017-11-07 15:39:11

标签: python dictionary pickle shelve

我是老师,我正在尝试编写一个简单的功能来拯救我的学生。字典中的电子邮件,用于其他程序。我需要在多个执行中保存字典,因此我尝试使用shelfFile = shelve.open('mydata') studentEmails = shelfFile['studentEmails'] def inputEmails(): while True: nameInput = input('Name: ') if nameInput == '': break emailInput = input('Email: ') if emailInput == '': print('Email not entered. Please try again.') continue while True: print('Is this information correct? [Y]es or [N]o') print('Name: ' + nameInput) print('Email: ' + emailInput) correctChoice = input('[Y] or [N]: ').upper() if correctChoice == 'Y': studentEmails[nameInput] = emailInput break elif correctChoice == 'N': print('Okay. Please input again.') break else: print('I did not understand that response.') inputEmails() shelfFile['studentEmails']=studentEmails shelfFile.close() 来保存它;然而,在第二次运行该函数后,我得到一个unpickling错误,说pickle数据被截断。这是代码:

_pickle.UnpicklingError: pickle data was truncated

在运行程序之前,我在shell中创建了空字典shelfFile [' studentEmails']。它会在第一次运行正常,但是当我尝试将shelfFile分配给studentEmails时,会给我if(is_singular( 'postType' )){ //code which you want to render for this perticular post type }else{ //your defalult code } 错误。我是新手,还在学习,所以我很感激你的帮助。

2 个答案:

答案 0 :(得分:0)

在玩完东西并阅读其他一些网站后,我能够使用pickle代替shelve来实现我想要的目标。以下是代码的样子:

import pickle
loadData = open('saveData.p','rb')
studentEmails = pickle.load(loadData)
loadData.close()
def inputEmails():
    while True:
        nameInput = input('Name: ')
        if nameInput == '':
            break
        emailInput = input('Email: ')
        if emailInput == '':
            print('Email not entered. Please try again.')
            continue
        while True:
            print('Is this information correct? [Y]es or [N]o')
            print('Name: ' + nameInput)
            print('Email: ' + emailInput)
            correctChoice = input('[Y] or [N]: ').upper()
            if correctChoice == 'Y':
                studentEmails[nameInput] = emailInput
                break
            elif correctChoice == 'N':
                print('Okay. Please input again.')
                break
            else:
                print('I did not understand that response.')
inputEmails()
saveData = open('saveData.p','wb')
pickle.dump(studentEmails,saveData)
saveData.close()

这适用于我正在做的事情。我必须使用占位符在shell中创建studentEmails字典,因为pickle不允许使用空字典。

答案 1 :(得分:0)

我遇到了同样的问题,经过一番调查后我意识到这可能发生了,因为我把我的程序当作一个混蛋(在使用搁架的过程中终止了它)。

所以我删除了我的搁架并再次创建它,一切正常。

我认为你有同样的错误,也许你通过终止程序或其他东西退出了你的无限循环?