Hello All, <Note: the below code only works on Windows as it currently writes a file out to 'C:\temp\address.txt'. I also use Linux, but do most of my development on Windows, sorry!, any advice still welcome!>
I'm currently in the midst of learning Python, and am absolutely loving the language thus far! I'm a .NET developer in my professional life, and have been recently influenced to learn Python - and I'm glad I was :) I am working on an address book application (input through raw_input(), nothing fancy) in the 2.7 redist. I'm essentially asking if someone wouldn't mind taking a look at what I have so far, and giving some advice on some of my weak areas, and areas I've marked with comments on how to better approach some of my solutions (in a more *Pythological* way :) ). I'm still familiarizing myself with Python, and I would greatly appreciate anyone's help in this task of mine :) Just a learning project for myself, one of many! I'm not sure how you would like the code, I'll simply paste it here since I imagine people are wear of opening attachments through email: import re # email validation import textwrap #wrapping text in raw_input (not sure if this is best way to do this?) # forward declarations addressBookPath = r'C:\temp\addresses.txt' addressBook = {} # address book held in memory before dumped to file emailFormatRegex = r'(\w[\w]*)@([\w]+\.[\w]+)' recordDelimiter = ' | ' # split name | email in file def LoadAddresses(): """ Loads all addresses from file and places them in tuple in form (bool, list), where the list is each row from the file (a person's name | email). """ success, lines = (False, []) try: f = open(addressBookPath, 'r') lines = f.readlines() f.close() success, lines = (True, lines) except IOError as e: print 'Error opening address book: ', e return (success, lines) def main(): (success, lines) = LoadAddresses() if not success: shouldMakeNewBook = raw_input(textwrap.fill("""You do not have an address book yet. Would you like to create one?""")) if shouldMakeNewBook in ('y', 'ye', 'yes'): f = open(addressBookPath, 'w') f.close() print 'New address book created.', addressBookPath else: print 'Exiting...' return else: # now that we have the file loaded into memory, # fill out the addressbook from file for line in lines: splitStr = line.split(recordDelimiter) addressBook[splitStr[0]] = splitStr[-1] # main input loop (break with 'q' or 'quit' during input) while True: newPersonNameInput = raw_input('Enter new person\'s name: (q/quit to stop):') if newPersonNameInput.lower() in ('q', 'quit'): break addressBook[newPersonNameInput] = newPersonNameInput while True: # loop until email is in valid format (x@y.z) newPersonEmailInput = raw_input('Enter new person\'s email: (q/quit to stop):') match = re.search(emailFormatRegex, newPersonEmailInput) if not match: print 'email validation failed... try again.' continue else: addressBook[newPersonNameInput] = newPersonEmailInput break # success RecordAddresses() print addressBook def RecordAddresses(): """ Writes out each address to the file in the form of name | email. """ f = open(addressBookPath, 'w') for k, v in sorted(addressBook.items()): #is there a better way to do this without placing a newline after each row? #it's causing multiple line separations when writing back out to file (because each # time we finish reading, it ends with a trailing newline). f.write("{0}{1}{2}\n".format(k, recordDelimiter, v)) f.close() if __name__ == '__main__': main() I appreciate any feedback! -catch
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor