《简明Python教程》中的地址簿
这几天在学Python,ESR在《How to be a hacker?》中首推了Python语言。Follow the path,follow the master。一开始,直接看了Python官方教程,后来不知怎么发现了《A Byte of Python》(简明Python教程,http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html),看得酣畅淋漓。
书后,有一个地址簿的任务:
我会建议你先解决这样一个问题:创建你自己的命令行 地址簿 程序。在这个程序中,你可以添加、修改、删除和搜索你的联系人(朋友、家人和同事等等)以及它们的信息(诸如电子邮件地址和/或电话号码)。这些详细信息应该被保存下来以便以后提取。
思考一下我们到目前为止所学的各种东西的话,你会觉得这个问题其实相当简单。如果你仍然希望知道该从何处入手的话,那么这里也有一个提示。
提示(其实你不应该阅读这个提示) 创建一个类来表示一个人的信息。使用字典储存每个人的对象,把他们的名字作为键。使用cPickle模块永久地把这些对象储存在你的硬盘上。使用字典内建的方法添加、删除和修改人员信息。
一旦你完成了这个程序,你就可以说是一个Python程序员了。现在,请立即寄一封信给我感谢我为你提供了这本优秀的教材吧。是否告知我,如你所愿,但是我确实希望你能够告诉我。
这里是我完成代码:
#!/usr/bin/python
# Filename: chanAddress
# Author: instona
class Contact:
def __init__(self,tel,email):
self.tel = tel
self.email = email
def modify(self,which,value):
if which == 'tel':
self.tel = value
elif which == 'email':
self.email = value
import sys
import cPickle
import os
if len(sys.argv)<2:
print "At least two arguments!"
sys.exit()
if sys.argv[1].startswith('-'):
# load contact data
dataPath= '/home/instona/Code/contact.data'
if not os.path.exists(dataPath):
conData = {}
else:
f = file(dataPath)
conData = cPickle.load(f)
f.close()
# various opertions
option = sys.argv[1][1:]
if option == 'a':
name = raw_input("Enter his/her name:")
tel = raw_input("His/her telephone number:")
email = raw_input("And email:")
contact = Contact(tel,email)
conData[name] = contact
elif option == 'm':
name = raw_input("Modify?Enter his/her name:")
try:
theOne = conData[name]
except KeyError:
print "We couldn't find '%s'!"%name
sys.exit()
if raw_input("Want his/her telephone number modified?<y/n>") == 'y':
newTel = raw_input("New telephone number is:")
theOne.modify('tel',newTel)
if raw_input("Want his/her email modified?<y/n>") == 'y':
newEmail = raw_input("New email is:")
theOne.modify('email',newEmail)
elif option == 'd':
name = raw_input("Delete?Enter his/her name:")
try:
theOne = conData[name]
except KeyError:
print "We couldn't find '%s'!"%name
sys.exit()
if raw_input("Sure to delte '%s'?<y/n>"%name) == 'y':
del conData[name]
elif option == 's':
name = raw_input("Delete?Enter his/her name:")
try:
theOne = conData[name]
except KeyError:
print "We couldn't find '%s'!"%name
sys.exit()
print "*****"
print "Name:",name
print "Tel:",theOne.tel
print "Email:",theOne.email
print "*****"
f = file(dataPath,'w')
cPickle.dump(conData,f)
f.close()
print "Operation Done."
else:
print "Unknown opetion: %s"%sys.argv[1]