[Tutor] KeyError

orbitz at ezabel.com orbitz at ezabel.com
Mon Jun 14 17:40:49 EDT 2004


This reply may come off as harsh, but I beleive it is in your best interest to
follow it.

Delete this code and start from scratch.  What you are trying to do can be done
in atleast half the amount of code you have given, and much cleaner.  You should
really be passing parameters and using more generic functions.  This is really
not like anything any python tutorial teachs from what I've seen. Looks like you
are taking bad practices from other languages an dusing it here.

Please, just rewrite the whole thign from scratch. If you take the time to think
it over you should come up with something that works better, in less time, and
far easier to debug.


On Mon, 14 Jun 2004 16:59:58 EDT
Dragonfirebane at aol.com wrote:

> Hello all,
> 
> Using the command prompt to run my program, the following error occurs. I do 
> not believe it is because I'm using the command prompt because the same error 
> occurs in IDLE.  Since I used the same structure to convert text to binary as 
> I did to convert text to hexadecimal (see code below error), I do not 
> understand why the hexadecimal conversion doesn't work but the binary does. 
> Additionally, much of the commenting had not been updated and is no longer
> correct, so please disregard any apparent misunderstanding through comments.
> 
> C:\Program Files\Python 2.3.4c1\Programming\Programs (Complete)>python 
> hexadecimal-binary-text.py
> Please enter numbers or text to be converted. "Hello. My name is Bob," said 
> Fred.
> Convert to:
> 1: Binary
> 2: Hexadecimal
> 3: Decimal
> 2
> Traceback (most recent call last):
>   File "Hexadecimal-Binary-Text.py", line 128, in ?
>     convertxthex()  ##convert text to hexadecimal
>   File "Hexadecimal-Binary-Text.py", line 36, in convertxthex
>     res += hexadec[c]  ##same deal
> KeyError: 'C'
> 
> 
> def convertxtbin(): ##convert text to binary
>     for char in original:   ##loops over the entire entry
>         x = 0   ##allows checking every character against the entire alphabet 
> list
>         if char in punct:
>             res += char
>         elif char in alphabet:
>             while x <= 26: ##if the character is punctuation or a lowercase 
> letter
>                 if char in alphabet[x]: ##if its in the dictionary
>                     asOctal = "%o" % int(number[x])
>                     global res
>                     for c in asOctal:
>                         res += binary[c]   ##add the corresponding entry in 
> the binary list to the res list
>                     if char not in punct: ##if the character isn't punctuation
>                         res += ' ' ##add a space at the end to separate 
> numbers
>                 x += 1  ##adds 1 to the value of x so the loop doesnt go on 
> forever
>             while 26 < x <= 52: ##if the character is an uppercase letter
>                 if char in alphabet[x]: ##if the character is in the alphabet 
> dictionary
>                     asOctal = "%o" % int(number[x - 26])
>                     global res
>                     for c in asOctal:
>                         res += binary[c]  ##print the corresponding entry in 
> the binary entry (A = entry 36, so 36 - 26 = entry 10 = '01' = a)
>                     if char not in punct:    ##if character isn't punctuation
>                         res += ' ' ##add a space at the end
>                 x += 1  ##adds 1 to x so the loop ends eventually
> def convertxthex(): ##convert text to hexadecimal
>     for char in original:   ##same deal
>         x = 0   ##same deal
>         if char in punct:
>             res += char
>         elif char in alphabet:
>             while x <= 26:  ##same deal
>                 if char in alphabet[x]: ##same deal
>                     asHex = "%X" % int(number[x])
>                     global res
>                     for c in asHex:
>                         res += hexadec[c]  ##same deal Line 36
>                     if char not in punct:    ##same deal
>                         res += ' ' ##same deal
>                 x += 1  ##same deal
>             while 26 < x <= 52: ##same deal
>                 if char in alphabet[x]: ##same deal
>                     asHex = "%X" % int(number[x - 26])
>                     global res
>                     for c in asHex:
>                         res += hexadec[c] ##same deal
>                     if char not in punct:    ##same deal
>                         res += ' ' ##same deal
>                 x += 1  ##same deal
> def convertxtnum(): ##convert text to decimal
>     for char in original:   ##same deal
>         x = 0   ##same deal
>         while x <= 34:  ##same deal
>             if char in alphabet[x]: ##same deal
>                 res.append(number[x])   ##same deal
>                 if char not in alphabet[:8]:    ##same deal
>                     res.append(' ') ##same deal
>             x += 1  ##same deal
>         while 34 < x <= 60: ##same deal
>             if char in alphabet[x]: ##same deal
>                 res.append(number[x - 26])  ##same deal
>                 if char not in alphabet[:8]:    ##same deal
>                     res.append(' ') ##same deal
>             x += 1  ##same deal
> def convertnum():   ##converts numbers
>     if whichconv in('1','Binary','binary','Bin','bin','B','b'): ##if user 
> wants to convert to binary
>         if int(original) <= 0:
>             print "Please enter a positive number. "   
>         try:
>             int(original)
>         except ValueError:
>             x = 0
>             if char in punct[x]:
>                 print [punct[x] for c in original] ##prints the corresponding 
> binary entry (if '12' is entered, it is treated as a string, so 
> binary[int(original) - 1] converts it to an integer and subtracts one from it
> so that the corresponding entry can be printed since the first entry in a list
> is 0
>                 x += 1
>         else:
>             asOctal = "%o" % int(original)
>             print ''.join([binary[c] for c in asOctal])     
>     elif whichconv 
> in('2','Hexadecimal','hexadecimal','Hexadec','hexadec','Hex','hex','H','h'):
> ##same deal
>         if original >= 0:
>             print hexadec[int(original) + 8]    ##same deal
>         else:
>             print "Please enter a positive number. " 
>     elif whichconv in('3','Text','text','T','t'):   ##same deal
>         if int(original) <= 26: ##if the number is between 8 and 27 (the 
> lowercase letters of the alphabet list
>             print alphabet[int(original) + 8]   ##it prints the corresponding 
> entry in the alphabet list
>         else:   ##if its not one of those numbers
>             print "Sorry, you didn't enter a valid number. Please enter only 
> numbers between 0 and 26." ##prints message
> 
> import time ##for time.sleep(1.1) at end
> import string
> 
> alphabet = [' 
> ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s'
> ,'t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L',
> 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']    
> ##define the alphabet list
> punct = ['.',',',';',':','?','!','"',"'"]
> binary = {'0':'000','1':'001','2':'010',
>              '3':'011','4':'100','5':'101',
>              '6':'110','7':'111'}  ##define the binary dictionary
> number = 
> ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','
> 17','18','19','20','21','22','23','24','25','26','27','28','29','30','
> 31','32','33','34']    ##defines the number entry. goes up to 34 so
> convertnum() will work under the text conversion hexadec = 
> {'0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':
> '9','10':'A','11':'B','12':'C','13':'D','14':'E','15':'F'}    
> ##defines the hexadecimal list
> 
> res = ''    ##makes an empty list so all the conversions will work
> again = True    ##beginning condition for loop
> while again:    ##starts loop
>     original = raw_input("Please enter numbers or text to be converted. ")  
> ##enter text to be converted
>     try:
>         int(original)   ##distinguishes the numbers from the text, needs to 
> be revised to distinguish binary and hexadecimal
> ##    except TypeError:
> ##        whichconv = raw_input("""Convert to:
> ##1: Binary
> ##2: Hexadecimal
> ##3: Decimal
> ##""")
> ##        if whichconv in('1','Binary','binary','Bin','bin','B','b'):
> ##            convertxtbin()
> ##            print ''.join(res)
> ##        elif whichconv 
> in('2','Hexadecimal','hexadecimal','Hexadec','hexadec','Hex','hex','H','h'):
> ##            convertxthex()
> ##        elif whichconv in('3','Decimal','decimal','Dec','dec','D','d'):
> ##            convertxtnum()
>     except ValueError:  ##if its not numbers
>         whichconv = raw_input("""Convert to:
> 1: Binary
> 2: Hexadecimal
> 3: Decimal
> """)    ##what conversion?
>         if whichconv in('1','Binary','binary','Bin','bin','B','b'): ##if 
> binary
>             convertxtbin()  ##convert text to binary
>         elif whichconv 
> in('2','Hexadecimal','hexadecimal','Hexadec','hexadec','Hex','hex','H','h'):
> ##if hexadecimal
>             convertxthex()  ##convert text to hexadecimal Line 128
>         elif whichconv in('3','Decimal','decimal','Dec','dec','D','d'): ##if 
> decimal
>             convertxtnum()  ##convert text to decimal
>         print res  ##print the list entries together on a line
>     else:   ##if the text is numbers
>         whichconv = raw_input("""Convert to:
> 1: Binary
> 2: Hexadecimal
> 3: Text
> """)    ##which conversion?
>         str(original)   ##convert numbers back to a string
>         convertnum()    ##convert numbers to whatever
>     more = raw_input("Would you like to convert more text or numbers [y/n]? 
> ")  ##more?
>     if more in 'Yy':    ##if so, continue loop
>         pass
>     elif more in 'Nn':  ##if not,
>         again = False   ##break loop
> print "Thank you for using Multivert.  Multivert will now close"    ##loop 
> broken, prints message
> time.sleep(1.1) ##waits for 1.1 seconds so message can be read
> ##end of program; program closes
> 
> Thanks in advance,
> Orri
> 



More information about the Tutor mailing list