1

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! :)

2
  • 1
    Try accounts[usernames]["password"]. The key to the dictionaries is the string "password". Currently it's trying to use whatever is in the variable password, which is not defined. Commented Sep 30, 2014 at 23:28
  • I think you have a bug. Where is newusername defined? Commented Sep 30, 2014 at 23:29

2 Answers 2

2

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.

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

9 Comments

Hi it should be a dictionary, and it all should be correct... The dictionary is being defined as "accounts = {}" and I am saving information like this "accounts[accountname] = {"password":accountpassword,"UUID":accountUUID}"
What are you getting if you print out: type(accounts) type(accounts[usernames])
Sorry when you say type is that actually something I should type in, or is it just in the parentheses should I type in? Sorry
Actually use the type function sorry. As in type(usernames) This will tell us if indeed you have a nested dictionary.
That means they are not dictionaries, as I suspected. Somehow, these variables are being overwritten to be strings. That's why python thinks you are trying to index a string rather than lookup a key in the dictionary.
|
0

The problem you are having is explained in this SO answer: https://stackoverflow.com/a/18931339/2356121

What you need to do in your case is:

for username in accounts: if username == loginusername: for account in accounts[username] accountpassword = account['password'] accountuuid = account['uuid'] 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.