最近学了下python,用python实现了一个电话簿工具,主要实现思路是:通过字典来存储电话簿信息,以姓名作为主键,以联系人对象作为值存储,最后保存的时候通过python标准库提供的cPickile模块将字典序列化到文件,读取的时候直接加载字典即可。本程序比较简单,整个程序只有一个类:Contacts类,代表联系人。初学,拿来练练手了!值得一提的是2.7.x版本的编码的问题,要么出现编码异常,要么就是乱码,主要原因是2.7.x中默认是ascii编码,这个问题比较复杂,不过遵循一定的规则编写可以很好地避免这类问题。有时间了专门写一篇文章介绍如何解决python中中文编码的问题!不过python 3.x似乎不用管这类问题,可以直接使用中文。

本程序主要功能如下:

源码:

# !/usr/bin/python

# -*- coding:utf-8 -*-

# Filename: phonebook.py

# Author: qianghaohao(CodeNutter)

# Email: codenutter@foxmail.com

# ------------------------------------编码问题------------------------------------

# import sys

# import locale

# print sys.getdefaultencoding() # 系统的缺省编码(一般就是ascii)

# print locale.getdefaultlocale() # 系统当前的编码

# print locale.getlocale() # 系统代码中临时被更改的编码

# print sys.getfilesystemencoding() # 文件系统编码

# print sys.stdin.encoding # 终端输入编码

# print sys.stdout.encoding # 终端输出编码

# # 代码缺省编码 :文件头 # -*- conding: utf-8 -*-

# --------------------------------------------------------------------------------

# 在python中内部编码是unicode,因此当前编码要先转换成unicode,然后再由unicode

# 转换成你需要的编码. 转换通过encode和decode函数,unicode相当于中间编码.

# decode encode

# str-------------->unicode-------------->str1

#---------------------------------------------------------------------------------

import sys

import os

import cPickle

import locale

# 联系人类--->最终联系人都是以此类的对象保存的,也就是对象序列化保存

class Contacts:

def __init__(self, name, tel, sex, email, address, birth):

self.name = name

self.tel = tel

self.sex = sex

self.email = email

self.address = address

self.birth = birth

def GetContactsInfo(self):

print U'姓名:%s' % (self.name).decode('utf-8') # 将utf-8转成Unicode输出,避免错误

print U'电话:%s' % (self.tel).decode('utf-8')

print U'性别:%s' % (self.tel).decode('utf-8')

print U'邮件:%s' % (self.email).decode('utf-8')

print U'地址:%s' % (self.address).decode('utf-8')

print U'出生日期:%s' % (self.birth).decode('utf-8')

def SetName(self, name):

self.name = name

def SetTel(self, tel):

self.tel = tel

def SetSex(self, sex):

self.sex = sex

def SetMail(self, mail):

self.mail = mail

def SetAddress(self, address):

self.address = address

def SetBirth(self, birth):

self.birth = birth

#----------------------------------------------------------------------------------------

# 封装自己的raw_input函数,避免重复的代码,为了保持很好的兼容性,先将提示串decode成unicode

# 然后再encode成和终端一样的编码,如果不这样做就会出现字符串的编码和终端编码不一致的状况,从而

# 导致乱码问题的出现。然后将raw_input函数的返回值再次decode成unicode,注意此时参数是stdin的

# 的编码,之所以这么做是因为stdin的编码不一定和python文本的编码一致,所以先转换成unicode,再

# 由unicode编码encode成utf-8编码,这样就保证了输入的字符串的编码和python源文件的编码一致了。

# ---------->这样做好绕...没办法,2.7.x就这样,也许还有其他解决方案,我先这么写.要是linux下

# 就没这么麻烦了...

#-----------------------------------------------------------------------------------------

def MyRawInput(prompt):

return raw_input(prompt.decode('utf-8').encode(sys.stdout.encoding)).decode(sys.stdin.encoding).encode('utf-8')

def ShowMenu():

print U'''

***************欢迎使用phonebook电话簿工具******************

1. 添加联系人

2. 删除联系人

3. 查找联系人

4. 编辑联系人

5. 显示所有联系人信息

6. 清空所有联系人

7. 帮助菜单

8. 保存电话簿

9. 退出系统

***************************************************************

'''

def EditMenu():

print U'''

----------------编辑选项-----------------

a. 编辑姓名

b. 编辑电话

c. 编辑性别

d. 编辑邮件

e. 编辑地址

f. 编辑出生日期

g. 调出菜单

h. 退出编辑

-----------------------------------------

'''

def GetHelp():

print U'''

GNU phonebook 1.0

By qianghaohao(CodeNutter)

Usage: phonebook [OPTION]... [FILENAME]...

--open 打开或新建电话簿

--version 版本信息

--help 使用帮助

'''

if (len(sys.argv) < 2):

print 'phonebook: missing OPTION'

print 'Usage: phonebook [OPTION]... [FILENAME]...'

print

print "Try 'phonebook --help' for more options"

sys.exit()

if sys.argv[1].startswith('--'):

option = sys.argv[1][2:]

if option == 'version':

print 'phonebook: Version 1.0'

elif option == 'help':

GetHelp()

elif option == 'open':

if len(sys.argv) < 3:

print '''

phonebook: missing FILENAME

Usage: phonebook [OPTION]... [FILENAME]...

'''

sys.exit()

filename = sys.argv[2]

try:

if os.path.exists(filename): # 如果电话簿文件存在,则加载到phonebook字典

f = file(filename)

phonebook = cPickle.load(f)

else: # 电话簿不存在则新建电话簿

phonebook = {}

except EOFError: # 如果文件为空,则加载失败,抛出异常,在此捕获异常并新建空字典

phonebook = {}

ShowMenu()

while True:

choice = MyRawInput('请输入您的选择(1-9)输入7可以调出帮助菜单:')

if choice == '1':

name = MyRawInput('姓名:')

tel = MyRawInput('电话:')

sex = MyRawInput('性别:')

mail = MyRawInput('邮件:')

address = MyRawInput('地址:')

birthday = MyRawInput('出生日期:')

phonebook[name] = Contacts(name, tel, sex, mail, address, birthday)

elif choice == '2':

name_to_del = MyRawInput('请输入要删除人的姓名:')

if phonebook.has_key(name_to_del):

del phonebook[name_to_del]

print U'联系人: %s 删除成功!' % name_to_del.decode('utf-8')

else:

print U'您要删的联系人: 不存在!' % name_to_del.decode('utf-8')

elif choice == '3':

name_to_find = MyRawInput('请输入要查找人的姓名:')

if phonebook.has_key(name_to_find):

phonebook[name_to_find].GetContactsInfo()

else:

print U'您要查找的联系人:不存在!' % name_to_find.decode('utf-8')

elif choice == '4':

name_to_modify = MyRawInput('请输入要编辑人的姓名:')

if phonebook.has_key(name_to_modify):

print U'===========您要编辑的联系人信息如下===========:'

phonebook[name_to_modify].GetContactsInfo()

EditMenu()

else:

print U'您要编辑的联系人:不存在!' % name_to_modify.decode('utf-8')

continue

while True:

to_modify_potion = MyRawInput('请输入您要编辑的选项(a-h)输入g调出菜单:')

if to_modify_potion == 'a':

new_name = MyRawInput('请输入新名字:')

phonebook[name_to_modify].SetName(new_name)

elif to_modify_potion == 'b':

new_tel = MyRawInput('请输入新电话:')

phonebook[name_to_modify].SetTel(new_tel)

elif to_modify_potion == 'c':

new_sex = MyRawInput('请输入新性别:')

phonebook[name_to_modify].SetSex(new_sex)

elif to_modify_potion == 'd':

new_mail = MyRawInput('请输入新邮件:')

phonebook[name_to_modify].SetMail(new_mail)

elif to_modify_potion == 'e':

new_addres = MyRawInput('请输入新地址:')

phonebook[name_to_modify].SetAddress(new_addres)

elif to_modify_potion == 'f':

new_birthday = MyRawInput('请输入新出生日期:')

phonebook[name_to_modify].SetBirth(new_birthday)

elif to_modify_potion == 'g':

EditMenu()

elif to_modify_potion == 'h':

break

else:

print U'输入错误,请重新输入(a-h)!'

elif choice == '5':

print U'===============所有联系人=============='

for name, contacts in phonebook.items():

contacts.GetContactsInfo()

print '---------------------------------------'

elif choice == '6':

phonebook.clear()

elif choice == '7':

ShowMenu()

elif choice == '8':

f = file(filename, 'w')

cPickle.dump(phonebook, f) # 存储电话簿到文件

f.close()

print U'''n电话簿已保存,注意您的电话簿路径为: %s''' % (os.path.abspath(filename)).decode('utf-8')

elif choice == '9':

sys.exit()

else:

print U'请输入正确的选择(1-9)!'

else:

print 'Unknown option!'

print "Try 'phonebook --help' for more options"

sys.exit()

else:

print '''

The option must start with '--'

Example: phonebook --open filename

print "Try 'phonebook --help' for more information."

'''

sys.exit()

python简易电话簿系统_Python实现电话簿工具(代码分享)相关推荐

  1. python做bi系统_Python开源 BI 工具 Superset 的搭建与初级使用

    Superset 是一款由 Airbnb 开源的"现代化的企业级 BI(商业智能) Web 应用程序",其通过创建和分享 dashboard(看板),为数据分析提供了轻量级的数据查 ...

  2. python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  3. 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  4. python制作考试系统_python测试框架数据生成工具最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  5. python atm银行取款系统_python ATM机 案例代码

    利用目前学的流程控制写的 ''' ATM机 需求: 1.登陆 输入账号输入密码 每日只有3次登陆密码错误的机会,超过3次禁止登陆 2.查询余额 3.存款 4.取款 5.转帐 6.退出 ''' info ...

  6. python成绩查询系统_Python爬虫实战:登录教务系统查成绩

    本文记录我用Python登录教务系统查询成绩的过程.手动输入验证码,简单获取成绩页面.后续将可能更新自动识别验证码登录查询 前期准备 本爬虫用到了Python的Requests库和BeautifulS ...

  7. Python 简易登录系统账号密码检测

    # 简易登录系统账号密码检测""" 知识点:1.while 循环语句2.if/elif/else 条件语句 """# 定义变量 s = 3 ...

  8. python简易英文字典_Python简单有道字典,python,简易,词典

    0.说明 通过浏览器跟踪[有道词典]和[有道翻译]网页查询过程,制作python简易字典. 制作过程: 踩点查词 踩点翻译 制作程序 1.踩点有道词典 1.1 先踩点查英文单词 F12浏览器登陆有道词 ...

  9. python写邮箱系统_Python django实现简单的邮件系统发送邮件功能

    本文实例讲述了Python django实现简单的邮件系统发送邮件功能.分享给大家供大家参考,具体如下: django邮件系统 Django发送邮件官方中文文档 总结如下: 1.首先这份文档看三两遍是 ...

最新文章

  1. 在普通Java类里使用spring里注入的service、dao等
  2. 编程之美 1.12 nim(2)
  3. boost::mpl模块实现lower_bound相关的测试程序
  4. 串口通讯编程一日通3(COMMTIMEOUTS DCB整理)
  5. python try语句相关(try/except/else/finally)
  6. URI,URL与URN的区别
  7. WCF中的REST是什么
  8. JDK多了一个shenandoah GC
  9. 2021最新抖音H5电玩城游戏平台多玩法模式全套源码
  10. Android中利用机器码注册机制防止破解
  11. 内网穿透工具NatApp使用教程
  12. android内存脚本教程,安卓内存
  13. 关于怎么在图片里加边框,这几个好用软件就能实现
  14. 2012年那些大败局
  15. 个人管理:“唐僧”之五项修炼
  16. 云原生不可变基础设施
  17. xp电脑自动锁定计算机,WinXP系统如何设置电脑自动关机?
  18. 快速备注一下IMSI和IMEI的区别
  19. 通用公司信息安全规范
  20. acwing 905 区间问题-区间选点

热门文章

  1. 如何绘制程序流程图?绘制程序流程图工具介绍及功能讲解
  2. 辽宁启迪:拼多多直通车对搜索流量有什么影响?
  3. 多租户 Saas 系统架构的设计思路
  4. 【2019.11.27】EM算法详细推导
  5. Problem Q: 计算公司员工的工资
  6. 农历2017年8月初4_2017年8月25日
  7. android充电指示灯颜色修改
  8. 编译链接实战(12)crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o是什么东西
  9. 深圳-数据岗位面试不完全记录(回忆版)
  10. Html中锚点的使用