分两种实现,一种没有用到类,一种用到了类,后者较为复杂
# -*- coding:gbk -*-
import os
import sys
import cPickle as p
#判断通讯录是否存在,不在则创建通讯录
if os.path.exists('contacts.dat') == False:
f = file('contacts.dat','wb') #以写、二进制的方式读A信息
temp = {'total':0}#创建一个字典,保存所有信息
p.dump(temp,f)#将信息存储到文件
f.close()
print "创建通讯录成功!"
else:
pass
#添加联系人
def add():
f = file('contacts.dat','rb')
a = p.load(f)#下载信息
f.close()
name = raw_input('请输入你要添加的联系人姓名:')
if a.has_key(name):#如果已经存在该键
print '该联系人已经存在!添加失败,请更名'
else:
tel = raw_input('请输入电话号码:')
email = raw_input('请输入邮箱:')
list = [tel,email] #将每个联系人的信息存到列表中
information = {name:list}#列表存入字典中
a['total'] += 1#联系人总数加一
a.update(information)#将信息添加到元组
f = file('contacts.dat','wb')
p.dump(a,f)#存储信息到文件
f.close()
print '添加成功'
#显示所有联系人
def showall():
f = file('contacts.dat','rb')
a = p.load(f)
print '一共有{}个联系人.\n'.format(a['total'])
print '{:<8}\t{:<15}\t{:<30}'.format('姓名','电话号码','邮箱')
for key in a.keys():
if key != 'total':
print "{:<8}\t{:<15}\t{:<30}".format(key,a[key][0],a[key][1])
f.close()
def exit():
sys.exit()
#查找
def search():
f = file('contacts.dat','rb')
a = p.load(f)
f.close()
name = raw_input('请输入需要查找的名字:')
if a.has_key(name):
print '{}的号码是:{}\t邮箱是{}'.format(name,a[name][0],a[name][1])
else:
print '没有该信息!'
#修改
def mod():
f = file('contacts.dat','rb')
a = p.load(f)
f.close()
name = raw_input('请输入需要修改的名字:')
if a.has_key(name):
new_tel = raw_input('请输入新的联系电话:')
new_email = raw_input('请输入新的邮箱:')
a[name][0] = new_tel
a[name][1] = new_email
f = file('contacts.dat','wb')
p.dump(a,f)
f.close()
print '修改成功'
else:
print '该联系人不存在'
def delete():
f = file('contacts.dat','rb')
a = p.load(f)
f.close()
name = raw_input('请输入需要删除的名字:')
if a.has_key(name):
a.pop(name)
a['total'] -= 1
f = file('contacts.dat','wb')
p.dump(a,f)
f.close()
print '删除成功'
else:
print '联系人不存在'
#主界面
def menu():
print
print "****************************"
print " 显示菜单提示信息: *"
print " 查找联系人: 1"
print " 添加联系人: 2"
print " 删除联系人: 3"
print " 更改联系人资料: 4"
print " 退出通讯录: 5"
print "****************************"
while True:
menu()
x=raw_input("请输入您的选择菜单号:")
if x == '2':
add()
showall()
continue
if x == '5':
print "谢谢使用!"
exit()
continue
if x == '1':
search()
continue
if x == '3':
delete()
showall()
continue
if x == '4':
mod()
showall()
continue
if x == '*':
menu()
else:
print "输入的选项不存在,请重新输入!"
Windows平台下
如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。
# -*- coding:gbk -*-
import os
import sys
import pickle as p
import time
contacts = {'total' : 0,'':{'phone':'','email':'','type':''}}
typelist = ['家人','朋友','同事']
class contact:
def __init__(self):
if os.path.exists('contacts.dat') == False:
f = file('contacts.dat','wb')
p.dump(contacts,f)
f.close()
def show(self):
print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format('姓名', '类型', '电话', '邮箱')
f = file('contacts.dat','rb')
temp = p.load(f)
f.close()
for key in temp.keys():
if key != 'total':
print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key,temp[key]['type'],temp[key]['phone'],temp[key]['email'])
#{}格式化输出,左对齐,字符宽度为8
def Add(self):
f = file('contacts.dat','rb')
temp = p.load(f)
f.close()
name = raw_input('请输入用户名:')
if temp.has_key(name):
print '已存在!请更名:'
else:
type = input('请输入类型:0-家人/1-朋友/2-同事')
phone = raw_input('请输入电话:')
email = raw_input('请输入邮箱:')
info = {'phone':phone,'email':email,'type':typelist[type]}
Info = {name:info}
save = raw_input('确认存储?y/n')
if save.lower() == 'y':
temp['total'] += 1
temp.update(Info)
f = file('contacts.dat', 'wb')
p.dump(temp,f)
f.close()
print '添加成功'
self.show()
else:
print '存储失败!'
def Mod(self):
f = file('contacts.dat','rb')
temp = p.load(f)
name = raw_input('请输入需要修改的名字:')
if temp.has_key(name):
type = input('请输入新的类型:0-家人/1-朋友/2-同事')
phone = raw_input('请输入新的电话:')
email = raw_input('请输入新的邮箱:')
info = {'phone':phone,'email':email,'type':typelist[type]}
mod = raw_input('确认修改?y/n')
if mod.lower() == 'y':
temp['total'] += 1
temp[name] = info
f = file('contacts.dat', 'wb')
p.dump(temp,f)
f.close()
print '修改成功'
self.show()
else:
print '修改失败!'
else:
print '不存在改名字!请更名'
def Del(self):
name = raw_input('请输入需要删除的名字:')
f = file('contacts.dat','rb')
temp = p.load(f)
if temp.has_key(name):
temp.pop(name)
temp['total'] -= 1
f = file('contacts.dat', 'wb')
p.dump(temp,f)
f.close()
print '删除成功'
self.show()
else:
print '没有该名字'
def Search(self):
t = input('按类型查找-0,按名字查找-1')
f = file('contacts.dat','rb')
temp = p.load(f)
if t == 0:
type = input('请输入类型 0-家人/1-朋友/2-同事')
for key in temp.keys():
if key != 'total' and temp[key]['type'] == typelist[type]:
print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key, temp[key]['type'], \
temp[key]['phone'],temp[key]['email'])
elif t == 1:
name = raw_input('请输入要查询的姓名:')
for key in temp.keys():
if key == name:
print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key, temp[key]['type'], \
temp[key]['phone'], temp[key]['email'])
else:
print '查询失败!'
def Menu(self):
print '******************通讯录*********************'
print '**** 添加-0 ************'
print '**** 修改-1 ************'
print '**** 删除-2 ************'
print '**** 查询-3 ************'
print '**** 退出-4 ************'
print '*********************************************'
test = contact()
print '欢迎查看通讯录!'
time.sleep(3)
test.show()
time.sleep(1)
while True:
test.Menu()
command = int(raw_input('请输入指令:0/1/2/3/4'))
if command == 0:
test.Add()
continue
elif command == 1:
test.Mod()
continue
elif command == 2:
test.Del()
continue
elif command == 3:
test.Search()
continue
elif command == 4:
print '欢迎使用!'
time.sleep(3)
sys.exit()
else:
print '没有该指令'
'''
raw_input与input的区别:
raw_input:把用户的输入转成字符串
input:不转换,按原类型存储
'''
运行效果:
C:\Python27\python.exe D:/PyTest_one/test.py
欢迎查看通讯录!
姓名 类型 电话 邮箱
dd 同事 456798 456
jj 朋友 454 44
kl 家人 456 465
******************通讯录*********************
**** 添加-0 ************
**** 修改-1 ************
**** 删除-2 ************
**** 查询-3 ************
**** 退出-4 ************
*********************************************
请输入指令:0/1/2/3/4