简体   繁体   中英

Accessing Python Dictionary Elements

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

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.

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']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM