3

I am trying to use a pickle in Python and I am failing miserably. For each error that I overcome I get another message. I get the following message when I run my code. I am getting a syntax error for my use of 'else'. Why is that?

I am a newb to Python but I can't figure out what am I doing wrong?

import pickle

def main():
    file_mail = open('email.dat','wb')
    save_data(file_mail)
    file_mail.close()


def save_data(file):
    email = {}

    count = 0

    while count == 0:
        print('Add an email: 1')
        print('Modify an email: 2')
        print('Delete an email: 3')
        print('Display the list: 4\n')

        choice = input('Enter a number from the list above:')

        if int(choice)== 1:
            name = input('Name:')
            mail = input('E-mail:')
            email[name] = mail
            print('Added Successfully')

            if int(choice) == 2:
                name = input('Name:')
                mail = input('E-mail:')
                email[name] = mail
                print('Modified Successfully')

                if int(choice) == 3:
                    name = input('Name:')
                    mail = input('E-mail:')
                    email[name] = mail
                    print('Deleted Successfully')

                    if int(choice) == 4:
                        print(email)

                        else:
                            print('Invalid selection')
                            c = input('Do you want to continue y/n: ')

                            if c.upper() == 'N':
                                count = 1
                                print('Invalid Letter')
                                file_mail = open('email.dat','wb')
                                pickle.dump(email,file_mail)
                                file_mail.close()
main()
1
  • 2
    When reading (at your 3rd line), you are opening your file with 'wb' which means write binary mode. Change that to 'rb' - read binary mode. Commented Apr 4, 2017 at 5:38

2 Answers 2

4

Try to use rb mode when reading a pickle-containing file :

file_mail = open('email.dat','rb')
email = pickle.load(file_mail)

And use wb mode when writing a pickled representation of obj to the open file object:

output = open('data.pkl', 'wb')
pickle.dump(data1, output)

See more details from pickle example.

Sign up to request clarification or add additional context in comments.

6 Comments

That was my original but I got the error message email = pickle.load(file_mail) EOFError: Ran out of input
@BWMustang13 you should check that the file is not empty, that's why you got the EOFError error.
I believe I ran it as the post suggested but I got the same error.
I updated my question to incorporate a slightly different approach by segregating i into 2 separate functions. See my changes above, but I am getting an invalid syntax error with the else statement. Why is that? It might be because I have been looking at code the last 18 hours but it looks like the indentations should be correct.
|
0

Thanks @McGrady! Here is the final answer I got.

import pickle

def main():
    file_mail = open('email.dat','wb')
    save_data(file_mail)
    file_mail.close()


def save_data(file):
    email = {}

    count = 0

    while count == 0:
        print('Add an email: 1')
        print('Modify an email: 2')
        print('Delete an email: 3')
        print('Display the list: 4\n')

        choice = input('\nEnter a number from the list above:')

        if int(choice)== 1:
            name = input('Name:')
            mail = input('E-mail:')
            email[name] = mail
            print('Added Successfully\n')

        else:
            if int(choice) == 2:
                name = input('Name:')
                mail = input('E-mail:')
                if name in email:
                    email[name] = mail
                    print('Modified Successfully\n')
                else:
                    print('Name not found')

            else:
                if int(choice) == 3:
                    name = input('Enter name you want to delete:')
                    if name in email:
                        email.pop(name)
                        print('Deleted Successfully\n')
                    else:
                       print('Name not found') 
                else:
                    if int(choice) == 4:
                        print(email)

                    else:
                        print('Invalid selection\n')
                        c = input('Do you want to continue y/n: ')
                        if c.upper() == 'N':
                            count = 1
                        else:
                            if c.upper() == 'N':
                                count = 1
                                print('Invalid Letter')

            file_mail = open('email.dat','wb')
            pickle.dump(email,file_mail)
            file_mail.close()
main()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.