[Tutor] Seek advise to code Re: Fw: Please submit to tutor list:
dictionary update prob
Eri Mendz
erimendz at gmail.com
Tue Jan 25 07:07:37 CET 2005
Kent Johnson <kent37 <at> tds.net> writes:
[snip]
> You still aren't doing anything with newdic. The absence of 'newdic' in the
> code
> after 'read.close()' should be a clue
>
> I think you want to overwrite the saved dict, but with the new dict instead of
> with a filename string...
Hi Kent,
First off, thanks again to you and Jacob and all. I have updated the simple
address book program and showing it here.
To me this program seems working to my expectation. but i need good advise from
the knowledgeable people here how to improve the program, comment on the coding
style, syntax and other things i obviously miss being a newbie.
I know this is not much of a program sans orinality as others must have been
done this a thousand times much better than mine. but anyway this is good
exercise for me to improve my understanding of python. TIA.
And sorry for this long boring code :-)). I hope the indentation stays intact.
#!/usr/bin/env python
'''
CHANGELOG
Tue Jan 25 08:11:07 AST 2005
1. moved all globals under if __name__ == '__main__'
Mon Jan 24 13:12:39 AST 2005
1. wrap few more common codes with function call
Sun Jan 23 15:06:54 AST 2005
1. address book is complete(at least to me) :-))
'''
## Functions ##################################################################
def about_program():
try:
print
print '\t'*2, '%s - %s' % (_name_, _version_)
print '\t'*2, 'A simple address book written in Python'
print '\t'*2, 'Cebwrpg Pbyynobengvba bs: '
print '\t' *2, _authors_[0], ',', _authors_[1]
print '\t'*2, 'Created:', _created_
print '\t'*2, 'Revised:', _revised_
raw_input('\nPress <Enter> to continue...')
clear_screen()
except EOFError:
print
## add_contact ##
def add_contact(d, f):
while True:
name = add_name()
email = add_email()
d[name] = email
print 'Add another contact? '
ans = ask_yes_no()
if ans == 0: # no
print 'Save to address book? '
get_ans = ask_yes_no()
if get_ans == 1: # yes save
check = if_file_exist(f)
if check == True:
read = open(f, 'rb')
stored = cPickle.load(read)
stored.update(d)
print "'%s' added to address book!\n" % d[name]
read.close()
write_book(stored, filename)
clear_screen()
else: # file not exist
write_book(data_holder, filename)
break
else: # no save
d.clear() #clear dict cache
clear_screen()
break
def add_name():
msg = _msg_ + ' (add): '
while True:
try:
name = raw_input(msg)
if len(name) != 0:
if len(name) <= 20:
return name
else:
print 'Name too long: please limit to 20 characters'
else:
print 'Try again: blank not allowed!'
except EOFError: # catch ^C-D keypress
print
def add_email():
msg = 'Enter email address: '
while True:
try:
email = raw_input(msg)
if len(email) == 0:
print 'Blank not allowed!'
else:
valid_format = r'\w[-.\w]*\@[-a-z0-9]+(\.[-a-z0-9]+)*\.(com$|\
edu$|net$|gov$|mil$|org$|int$|aero$|biz$|coop$|museum$|pro$|info$)'
valid_email = re.compile(valid_format)
if valid_email.match(email):
return email
else:
print '%s is not a valid address: try again!' % email
except EOFError:
print
def ask_yes_no():
ask = raw_input('Yes or No? (y|[N]) ')
if ask.lower() in ['y', 'ye', 'yes', 'yep', 'ok']:
return 1 # yes
else:
return 0 # no
def if_file_exist(f):
''' test if file exists; returns boolean '''
return os.path.exists(os.path.join(os.path.expanduser('~'), f))
def write_book(d, f):
write = open(f, 'wb')
cPickle.dump(d, write)
write.close()
def update_dict(d, f):
''' update the saved dictionary file '''
read = open(f, 'rb')
newdic = cPickle.load(read)
newdic.update(d)
read.close()
def view_abook(d, f):
check = if_file_exist(f)
if check is True:
display_contacts(data_holder, filename)
raw_input('\nPress <Enter> to continue...')
clear_screen()
else:
print 'no contacts listed!'
def display_contacts(d, f):
read = open(f, 'rb')
d = cPickle.load(read)
print 'Total contact[s]: %d\n' % len(d)
while 1:
index = 0
for key in d:
name = key
while len(name) < 25:
name += '.' # append to name
index += 1
print index, name, d[key]
break
read.close()
def find_contact(d, f):
msg = _msg_ + ' (find): '
while 1:
try:
read = open(f, 'rb')
d = cPickle.load(read)
find = raw_input(msg)
if d.has_key(find):
print 'Found:%s\temail:%s' % (find, d[find])
else:
print "'%s' not found" % find
print 'Try again? (find)'
ans = ask_yes_no()
if ans == 0: #no
read.close()
clear_screen()
break
read.close()
except EOFError:
print
def remove_contact(d, f):
msg = _msg_ + ' (remove): '
while 1:
try:
read = open(f, 'rb')
stored = cPickle.load(read) # assign new dict name
remove = raw_input(msg)
if stored.has_key(remove):
print "Found '%s'" % remove
print "Really remove '%s'?" % remove
confirm = ask_yes_no()
if confirm == 1: #yes
del stored[remove]
stored.update(d) # update changed dict
read.close()
print "'%s' is removed!" % remove
write_book(stored, filename)
else:
read.close()
else:
print "'%s' not found" % remove
print 'Try again? (remove)'
ans = ask_yes_no()
if ans == 0:
read.close()
clear_screen()
break
except EOFError:
print
def edit_contact(d, f):
msg = _msg_ + ' (edit): '
while 1:
try:
read = open(f, 'rb')
stored = cPickle.load(read)
edit = raw_input(msg)
if stored.has_key(edit):
print "Found '%s'" % edit
print "Really edit '%s'?" % edit
confirm = ask_yes_no()
if confirm == 1: # yes
print "'%s' with email: %s will be edited" \
% (edit, stored.pop(edit))
name = add_name()
email = add_email()
stored[name] = email # add new name/email
stored.update(d)
read.close()
write_book(stored, filename)
else: # no, dont edit
read.close()
else:
print "'%s' not found!" % edit
print 'Try again? (edit)'
ans = ask_yes_no()
if ans == 0: # no
read.close()
clear_screen()
break
except EOFError:
print
def clear_screen():
os.system('clear')
def ifaccessible(f):
''' test if file is accessible by user; returns boolean '''
return os.access(os.path.join(os.path.expanduser('~'), f), os.F_OK)
def main():
while True:
select = main_menu()
while True:
if select in [ '1', 'p']:
about_program()
break
elif select in [ '2', 'a']:
add_contact(data_holder, filename)
break
elif select in [ '3', 'v']:
view_abook(data_holder, filename)
break
elif select in [ '4', 'f']:
find_contact(data_holder, filename)
break
elif select in [ '5', 'e']:
edit_contact(data_holder, filename)
break
elif select in [ '6', 'r']:
remove_contact(data_holder, filename)
break
elif select in [ '7', 'q']:
sys.exit('Goodbye')
else:
print "'%s' is invalid option!" % select
break
def main_menu():
'''Show menu options'''
print """
MENU OPTIONS
[1] About This [P]rogram
[2] [A]dd Contact
[3] [V]iew Address Book
[4] [F]ind Contact
[5] [E]dit Contact
[6] [R]emove Contact
[7] [Q]uit
"""
while 1:
try:
ask = '\nSelect an option: '
opt = raw_input(ask)[0]
#if opt.isalpha() == True: # truth test redundant
if opt.isalpha():
return opt.lower()
return opt
except (IndexError, EOFError): # catch <Enter>, <^C-D> keys
pass
## main program portion ##
if __name__ == '__main__':
import cPickle, os, sys, string, re
#globals
_name_ = 'Py_AddBook'
_version_ = '1.00'
_created_ = 'December 2, 2004'
_revised_ = 'Sun Jan 23 15:06:54 AST 2005'
_authors_ = ['Rev Zraqm <revzraqm at snfgznvy.sz>',
'Whfgva Fgenhor <whfgvafgenhor at punegre.arg>']
_msg_ = 'Enter contact name'
home = '~'
filename = os.path.join(os.path.expanduser(home), 'abook.dat')
data_holder = {}
main()
More information about the Tutor
mailing list