dear jacob,
sorry to send this to you but if you may, kindly send to tutor list as im
no longer subscribed. my problem is in the update dict portion: it just
doesnt update regardless how many contacts i add. kindly advise where
my mistake is or code gone wrong. the rest of the options i will do on my
own so just hold off the helps for now. appreciate all your good help.
please cc to this account.
--
regards,
erimendz
#!/usr/bin/env python
import cPickle, os, sys, re, stat
#import string
## Global variables
home = '~'
filename = os.path.join(os.path.expanduser(home), 'abook.dat')
data_holder = {}
## Functions
##################################################################
def about_program():
print
print '\t'*2, 'A simple address book written in Python'
raw_input('\nPress <Enter> to continue...')
## add_contact ##
def add_contact(d):
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
#collected = d
check = if_file_exist(filename)
if check is True:
update_dict(data_holder, filename)
else: # file no exist
write_book(data_holder, filename)
break
else:
d.clear() #clear dict
break
def add_name():
msg = 'Enter contact name: '
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'[EMAIL PROTECTED](\.[-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():
try:
ask = raw_input('Yes or No? [y|N] ')
if ask.lower() in ['y', 'ye', 'yes', 'yep', 'ok']:
return 1 # yes
else:
return 0 # no
except EOFError:
print
def if_file_exist(f):
''' test if file exists; returns boolean '''
return os.path.exists(os.path.join(os.path.expanduser('~'), f))
def get_filesize(f):
''' check file size '''
return os.stat(os.path.join(os.path.expanduser('~'), f))[stat.ST_SIZE]
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()
## view_abook() ##
def view_abook(d, f):
check = if_file_exist(f)
if check is True:
# load file and pretty print
read = open(f, 'rb')
d = cPickle.load(read)
for k, v in d.iteritems():
print '%s\t%s' % (k, v)
read.close()
else:
print 'no contacts listed!'
## function tester, sort of ##
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)
break
elif select in [ '3', 's']:
print "save_changes()"
break
elif select in [ '4', 'v']:
view_abook(data_holder, filename)
break
elif select in [ '5', 'f']:
print "find_contact()"
break
elif select in [ '6', 'e']:
print "edit_contact()"
break
elif select in [ '7', 'r']:
print "remove_contact()"
break
elif select in [ '0', 't', 'T']:
#print if_file_exist(filename)
#print get_filesize(filename)
try:
print get_filesize(filename)
except OSError:
print '%s not found!' % filename
break
elif select in [ '8', '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] [S]ave Changes
[4] [V]iew Address Book
[5] [F]ind Contact
[6] [E]dit Contact
[7] [R]emove Contact
[0] [T]est function
[8] [Q]uit
"""
while 1:
try:
ask = '\nSelect an option: '
opt = raw_input(ask)[0]
#if opt.isalpha() == True: # redundant True
if opt.isalpha():
return opt.lower()
return opt
except (IndexError, EOFError): # catch <Enter>, <^C-D> keys
pass
## main program portion ##
if __name__ == '__main__':
main()