Accessing Python Dictionary Elements
Question: I want to save raw input elements in a dictionary to a variable. Here is a
sample of what I am doing:

    
    
    accounts = {}
    
    def accountcreater():
      accountname = raw_input("Account Name: ")
      accountpassword = raw_input("Account Password: ")
      accountUUID = 1
      accountUUID += 1
      accounts[accountname] = {"password":accountpassword,"UUID":accountUUID}
    
    def login():
      loginusername = raw_input("Account Name: ")
      loginpassword = raw_input("Account Password: ")
      for usernames in account:
        if usernames == loginusername:
          accountpassword = accounts[usernames][???]
          accountpassword = accounts[usernames][???]
        else:
          pass
    

That is a very simple example of what the code is like. Now the part where the
"[???]" is I have no idea what to put. I tried putting this code:

    
    
          accountpassword = accounts[usernames][password]
          accountpassword = accounts[usernames][UUID]
    

But that does not seem to work because it says `password` and `UUID` are not
defined. Yet I seem to be able to just input `[usernames]` and it will work
just fine. Any ideas?

## EDIT

For the follow code:

    
    
      accountpassword = accounts[usernames]['password']
      accountpassword = accounts[usernames]['UUID']
    

I have also tried putting them in strings, and it raises this error: `String
indices must be integers, not str`.

## EDIT 2

This is my code in its entirety, please be warned it is very long and
extensive. The only part that you need will be at the top under the functions
startup, login, and account.

    
    
    import datetime
    import time
    #import pickle
    
    filesfile = "filesfiles" #File's Pickle File
    accountfile = "accountsfiles" #Account's Pickle File
    
    accounts = {} #Where accounts are put
    files = {} #Where files are put
    
    currentaccount = None #The current account the user is on
    
    #accountsaver = open(accountfile,'r') #Restores all current accounts
    #accounts = pickle.load(accountsaver)
    #accountsaver.close()
    
    #filesaver = open(filesfile,'r') #Restores all current files
    #files = pickle.load(filesaver)
    #filesaver.close()
    
    def startup():
        for accountname in accounts:
            # accountpassword = accounts[accountname]['password']
            print type(accountname)
        #accountsaver = open(accountfile,'wb') #Adds a new account if there is one
        #pickle.dump(accounts, accountsaver)   
        #accountsaver.close()
        print "\n          -------------------          "
        print "          FILE SYSTEM MANAGER          "
        print "          -------------------          "
        print "\n To login type in: LOGIN"
        print " To create a new account type in: ACCOUNT"
        loginornew = raw_input("\n Please enter LOGIN or ACCOUNT: ") #Input to see where you want to go
        if loginornew.lower() == "login":
            login()
        elif loginornew.lower() == "account":
            newaccount()
        else:
            startup()
    
    def newaccount():
        newusername = ""
        newpassword = ""
        newpasswordagain = ""
        UUID = 0 #UUID variable
        print "\n--------------------------------------------"
        print "\n Would you like to create a new account?"
        yesorno = raw_input("\n Please enter YES or NO: ") #Checks to see if user wants to create a new account
        if yesorno.lower() == "no":
            print "\n--------------------------------------------"
            startup()
        elif yesorno.lower() == "yes":
            while len(newusername) < 8: #Checks to see if username is atleast 8 characters
                newusername = raw_input("\n Username must be atleast 8 characters\n Please enter a username for your account: ")
            while len(newpassword) < 5: #Checks to see if password is atleast 5 characters
                newpassword = raw_input("\n Password must be atleast 5 characters\n Please enter a password for your account: ")
            while newpasswordagain == "": #Makes sure there is a input
                newpasswordagain = raw_input(" Please confirm the password for your account: ")
            if newpassword == newpasswordagain: #Checks to make sure the password is correct
                for username in accounts: #Loops through all usernames in acccounts
                    if username.lower() == newusername.lower(): #Checks to see if the username already exists
                        print "\n Username already exists"
                        print " Please try again"
                        newaccount()
                    else: #If the username is not taken and the password is correct it creates the accounts
                        pass
                UUID += 1 #Makes the current UUID number bigger by one
                accounts[newusername] = {"password":newpassword,"UUID":UUID} #Creates a new account
                print "\n Account Created"
                print "\n--------------------------------------------"
                startup() #Takes you back to startup menu
            else: #If the passwords do not match each other
                print "\n Passwords do not match"
                print " Please try again"
                newaccount()
        else:
            newaccount()
    
    def login():
        username = ""
        password = ""
        print "\n--------------------------------------------"
        print "\n Would you like to login?"
        yesorno = raw_input("\n Please enter YES or NO: ") #Checks to see if user wants to login
        if yesorno.lower() == "no":
            print "\n--------------------------------------------"
            startup()
        elif yesorno.lower() == "yes":
            for usernames2 in accounts: #Testing Purposes
                print usernames2, #Testing Purposes
            print "" #Testing Purposes
            for usernames23 in accounts: #Testing Purposes
                for usernames3 in str(accounts[usernames23]): #Testing Purposes
                    print usernames3, #Testing Purposes
            while username == "": #Makes sure there is a input
                username = raw_input("\n Please enter your username: ")
            while password == "": #Makes sure there is a input
                password = raw_input("\n Please enter your password: ")
            for usernames in accounts: #Loops through all usernames in accounts
                if username.lower() == usernames.lower(): #Checks to see if the username input equalls a username in the accounts dictionary
                    accountpassword = accounts['username'][password]
                    accountUUID = 0
                    if password == accountpassword:
                        for accountname in accounts:
                            accountpassword = accounts[accountname]
                        print "\n Access Granted"
                        print "\n--------------------------------------------"
                        menu()
                    else:
                        pass
                    print "\n Access Denied"
                    print "\n Please try again"
                    login()
                else:
                    pass
            print "\n Access Denied"
            print "\n Please try again"
            login()
        else:
            login()
    
    def menu():
        #filesaver = open(filesfile,'wb') #Adds a new file if there is one
        #pickle.dump(files, filesaver)   
        #filesaver.close()
        print "\n          -------------------          "
        print "          FILE SYSTEM MANAGER          "
        print "          -------------------          "
        print "\n What would you like to do with your files?"
        print "   To make a new file type in: NEW"
        print "   To edit a current file type in: EDIT"
        print "   To delete a current file type in: DELETE"
        print "   To view all current files type in: ALL"
        chooser = raw_input("\n Please enter NEW, EDIT, DELETE, or ALL: ") #Input to see where you want to go
        if chooser.lower() == "new":
            newfile()
        elif chooser.lower() == "edit":
            editfiles()
        elif chooser.lower() == "delete":
            deletefiles()
        elif chooser.lower() == "all":
            allfiles()
        else:
            menu()
    
    def newfile():
        filename = ""
        filetext = ""
        while filename == "": #Makes sure there is a input
            print "--------------------------------------------"
            filename = raw_input("\n Please input your new files name: ")
        while filetext == "":
            filetext = raw_input("\n Please input the text for your new file: ")
        filedate = datetime.date.today() #Grabs the current date
        files[filename] = {userUUID:{filedate:filetext}} #Creates a new file
        print "\n File Added"
        print "\n--------------------------------------------"
        menu()
    
    def editfiles():
        print "--------------------------------------------"
        print " To edit a file type in: EDIT"
        print " To view all current files type in: ALLFILES"
        print " To cancel type in: CANCEL"
        wheretogo = raw_input("\n Please enter EDIT, ALLFILES, or CANCEL: ")
        if wheretogo.lower() == "edit":
            print "\n To edit a file type in its name"
            print " To cancel type in: CANCEL"
            print "\n **Please Note** Editing a file changes its date!"
            editname = raw_input("\n Please type in the file's name or CANCEL: ")
            if editname.lower() == "cancel":
                menu()
            else:
                newcontents = ""
                for filename in files: #Loops through all file names in files
                    if filename.lower() == editname.lower():
                        print "\n What would you like this file to say?"
                        while newcontents == "":
                            newcontents = raw_input("\n Please input files new contents: ")
                        filetext = newcontents
                        filedate = datetime.date.today()
                        files[filename] = {filedate:filetext}
                        print "\n File Changed"
                        print "--------------------------------------------"
                        menu()
                    else:
                        pass
                print "\n File not found!"
                editfiles()
        elif wheretogo.lower() == "allfiles":
            print "\n--------------------------------------------"
            for filename in files:
                print "File Name: " + str(filename)
            print "--------------------------------------------"
            print "\n To edit a file type in: EDIT"
            print " To cancel type in: CANCEL"
            print "\n **Please Note** Editing a file changes its date!"
            wheretogo = raw_input("\n Please enter EDIT or CANCEL: ")
            if wheretogo.lower() == "edit":
                editname = raw_input("\n Please type in the file's name to edit it: ")
                newcontents = ""
                for filename in files:
                    if filename.lower() == editname.lower():
                        print "\n What would you like this file to say?"
                        while newcontents == "":
                            newcontents = raw_input("\n Please input files new contents: ")
                        filetext = newcontents
                        filedate = datetime.date.today()
                        files[filename] = {filedate:filetext}
                        print "\n File Changed"
                        print "--------------------------------------------"
                        menu()
                    else:
                        pass
                print "\nFile not found!"
                editfiles()
            elif wheretogo.lower() == "cancel":
                menu()
            else:
                menu()
        elif wheretogo.lower() == "cancel":
            menu()
        else:
            menu()
    
    def deletefiles():
        print "--------------------------------------------"
        print " To delete a file type in: DELETE"
        print " To view all current files type in: ALLFILES"
        print " To cancel type in: CANCEL"
        wheretogo = raw_input("\n Please enter DELETE, ALLFILES, or CANCEL: ")
        if wheretogo.lower() == "delete":
            print "\n To delete a file type in its name"
            print " To cancel type in: CANCEL"
            deletename = raw_input("\n Please type in the file's name or CANCEL: ")
            if deletename.lower() == "cancel":
                menu()
            else:
                for filename in files:
                    if filename.lower() == deletename.lower():
                        del files[filename]
                        print "\n File Removed"
                        print "--------------------------------------------"
                        menu()
                    else:
                        pass
                print "\n File not found!"
                deletefiles()
        elif wheretogo.lower() == "allfiles":
            print "\n--------------------------------------------"
            for filename in files:
                print "File Name: " + str(filename)
            print "--------------------------------------------"
            print "\n To delete a file type in: DELETE"
            print " To cancel type in: CANCEL"
            wheretogo = raw_input("\n Please enter DELETE or CANCEL: ")
            if wheretogo.lower() == "delete":
                deletename = raw_input("\n Please type in the file's name to delete it: ")
                for filename in files:
                    if filename.lower() == deletename.lower():
                        del files[filename]
                        print "\n File Removed"
                        print "--------------------------------------------"
                        menu()
                    else:
                        pass
                print "\nFile not found!"
                deletefiles()
            elif wheretogo.lower() == "cancel":
                menu()
            else:
                menu()
        elif wheretogo.lower() == "cancel":
            menu()
        else:
            menu()
    
    def allfiles():
        filetexttotal = ""
        for filename in files:
            print "\n--------------------------------------------"
            print "\nFile Name: " + str(filename)
            for filedate in files[filename]:
                print "File Date: " + str(filedate)
                for filetext in files[filename][filedate]:
                    filetexttotal = filetexttotal + str(filetext)
                print "File Contents: " + str(filetexttotal)
                filetexttotal = ""
        print "\n--------------------------------------------"
        menu()
    
    startup()
    

Please note also on top of all of that. This code may have some errors, it is
a work in progress. Yes if you are wondering, this is a filing system! :)


Answer: You need them as strings:

    
    
      accountpassword = accounts[usernames]['password']
      accountpassword = accounts[usernames]['UUID']
    

You defined your nested dictionary with stringed keys:

    
    
    accounts[newusername] = {"password":accountpassword,"UUID":accountUUID}
    

Therefore, lookup requires the string name. Did that fix your problem?

## In regard to your recent edit:

Sounds like your `accounts` variable is not a dictionary, or at least not a
nested dictionary. Sounds like a string is being returned, and you are trying
to index it, rather than a dictionary being returned.

