Python - pickle.load() takes one positional argume

2019-08-07 17:18发布

问题:

This produces an error:

pickle.load() takes one positional argument (2 given)

Here is my code:

import pickle, os.path

created = False

phoneBook = {}
name = input("Please enter a name(or press enter to end input): ")
while name != '':
    number = input("Please enter number: ")
    phoneBook[name] = number
    name = input("Please enter a name(or press enter to end input): ")
    if name == '':
        print("Thank You!")

print("Your phonebook contains the following entries:")
for name, number in phoneBook.items():
    print("%s - %s" % (name, number))

while not created:
    if not os.path.isfile('phonebook.json'):
        phoneBook_Ori = pickle.load('phonebook.json', 'r')
        created = True
    else:
        phoneBook_Ori = pickle.load('phonebook.json', 'w')
        phoneBook_Upd = phoneBook_Ori.update(phoneBook)
        phoneBook_Ori.write(phoneBook_Upd)

phoneBook_Ori.close

Why isn't it pickling data?

回答1:

This is not how you use pickle.load:

phoneBook_Ori = pickle.load('phonebook.json', 'r')

It takes a file object as an argument when de-serializing from a file, not strings.

Try this instead:

# create file object with permissions
with open('phonebook.json', 'r') as f:
    # load using pickle de-serializer
    phoneBook_Ori = pickle.load(f)

Saving is almost the same, make sure you have the updated phonebook in scope:

with open('phonebook.json', 'wb') as f:
    phoneBook_Ori = pickle.dump(phonebook, f)

As for the rest of the code, you may want to read another answer I've given that is very similar.



标签: python pickle