python写一个通讯录step by step V2.0引用知识list + dict用于临时存储用户数据信息
cPickle用于格式化文件存取
依旧使用file来进行文件的存储
解决问题
1、操刀开始去做原始代码 实现功能(可做模板)
1、判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错
2、调用os模块的exit功能
3、字典配合循环加上函数实现switch的功能#!/usr/bin/env python
#coding:utf8
#Author:zhuima
#Date:2015-03-22
#Version:0.1
#Function:display a list and add date
# 导入模块
import os
def menu():
'''设置munu目录,提供给用户的操作接口 '''
print '''
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
'''
op = raw_input('Please select one >>> ')
return op
def txl_exit():
''' 退出程序 '''
os._exit(0)
def txl_error():
''' 当用户输出选项不在定义的选项内的时候,报错'''
print 'Unkonw options,Please try again!'
# 定义dict,配合函数实现switch功能
ops = {
# '1':txl_add,
# '2':txl_dis,
# '3':txl_update,
# '4':txl_del,
# '5':txl_sort,
'0':txl_exit,
}
def main():
'''主程序 '''
while True:
op = menu()
ops.get(op,txl_error)()
if __name__ == '__main__':
main()
2、添加用户思路
默认定义一个空list,然后嵌套dict来实现临时存储功能1、添加的代码# 导入模块
import os
txl = []
....
def txl_add():
'''添加用户'''
name = raw_input('Please Enter Your Name >>> ')
age = raw_input('Please Enter Your Age >>> ')
gender = raw_input('Please Enter Your Gender >>> ')
tel = raw_input('Please Enter Your Tel >>> ')
txl.append({'name':name,'age':age,'gender':gender,'tel':tel})
def txl_disp():
'''显示原始的txl列表 '''
print txl
.....
ops = {
'1':txl_add,
'2':txl_disp,
# '3':txl_update,
# '4':txl_del,
# '5':txl_sort,
'0':txl_exit,
}
2、测试结果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
[]
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> zhuima
Please Enter Your Age >>> 28
Please Enter Your Gender >>> f
Please Enter Your Tel >>> 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
[{'gender': 'f', 'age': '28', 'tel': '10086', 'name': 'zhuima'}]
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 0
3、完整代码块
3、格式化输出格式化输出,使用字典
格式化输出:print "%(name)s %(age)s" % dict1、添加代码片段def txl_disp():
'''显示原始的txl列表 '''
print "name age gender tel"
print "-----------------------"
for x in txl:
print "%(name)s %(age)s %(gender)s %(tel)s" % x
2、测试结果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> zhuima
Please Enter Your Age >>> 28
Please Enter Your Gender >>> f
Please Enter Your Tel >>> 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> nick
Please Enter Your Age >>> 25
Please Enter Your Gender >>> m
Please Enter Your Tel >>> 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> kale
Please Enter Your Age >>> 33
Please Enter Your Gender >>> f
Please Enter Your Tel >>> 10011
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 28 f 10086
nick 25 m 10010
kale 33 f 10011
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 0
3、完整代码
4、文件写入与读取思路:
引入cPickle概念,cPickle对文件进行读取与存入的格式化操作,
cPickle的loads功能(从文件中读取文件,保证原有格式)和dumps(把相关格式的对象文件存放到文件中)功能1、添加代码块# 导入模块
import os
import cPickle
# 定义数据库文件名
fname = 'contact.db'
txl = []
...
def txl_add():
'''添加用户'''
....
#调用txl_save()模块
txl_save()
def txl_disp():
'''显示原始的txl列表
做了二次调整,如果txl为空,则打印木有文件存在,如果txl不为空
则打印出数据信息'''
if len(txl) > 0:
print "name age gender tel"
print '----------------------------'
for x in txl:
print "%(name)s %(age)s %(gender)s %(tel)s" % x
else:
print ">>> This is a empty file,There is no infomation! >>>"
def txl_save():
'''使用cPickle进行列表到字符串的转换 然后写入文件 '''
s = cPickle.dumps(txl)
fp = file(fname,'w')
fp.write(s)
fp.close()
def txl_load():
'''从文件读取信息,然后使用cPickle进行字符串到列表的转换'''
if os.path.exists(fname):
fp = file(fname)
s = fp.read()
fp.close()
txl.extend(cPickle.loads(s))
2、写入测试结果[root@mysql01 day0330]# ls
test.py v2_1.py v2.py
[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
>>> This is a empty file,There is no infomation! >>>
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> zhuima
Please Enter Your Age >>> 25
Please Enter Your Gender >>> f
Please Enter Your Tel >>> 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 1
Please Enter Your Name >>> nick
Please Enter Your Age >>> 22
Please Enter Your Gender >>> m
Please Enter Your Tel >>> 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
nick 22 m 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 0
[root@mysql01 day0330]# ls
contact.db test.py v2_1.py v2.py
3、读取测试结果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
nick 22 m 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 0
[root@mysql01 day0330]#
4、完整代码
5、删除用户思路:
根据用户名来进行数据的删除
先来看一个演示案例演示如何删除嵌套列表字典In [6]: s
Out[6]: [{'age': 25, 'name': 'zhuima'}, {'age': 33, 'name': 'nick'}]
#第一个思路就是要使用del来进行字典的删除,但是针对嵌套不生效
In [7]: for x in s:
if x['name'] == 'zhuima':
del x
...: print s
...:
[{'age': 25, 'name': 'zhuima'}, {'age': 33, 'name': 'nick'}]
# 后来使用列表的remove来进行删除,成功
In [10]: for x in s:
if x['name'] == 'zhuima':
s.remove(x)
....:
In [11]: s
Out[11]: [{'age': 33, 'name': 'nick'}]
1、代码片段def txl_del():
'''根据用户名进行删除用户相应的信息,并进行数据存储,如果用户不输人该如何'''
name = raw_input('Please Enter Your Want To Delete name >>> ')
for line in txl:
if line['name'] == name:
txl.remove(line)
break
#最后记得调用存入的函数,要不然删除仅针对当前会话,没有写入文件
txl_save()
2、测试效果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
nick 22 m 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 4
Please Enter Your Want To Delete name >>> nick
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 0
[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>>
3、完整代码
6、根据用户输入自定义排序思路:
根据用户的选择进行排序操作
引入功能,就是lambda txl.sort(key=lambda x : x[op])1、代码片段def txl_sort():
'''根据用户的输入对数据进行排序,用到了lambda函数,有bug的,应该提供一个默认值出来进行排序'''
op = raw_input('Order By [name | age | gender | tel ] Display >>> ')
txl.sort(key=lambda x : x[op])
txl_disp()
2、测试结果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
zhuima 25 f 10086
nick 22 m 10011
kale 29 f 10093
tony 18 m 10010
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 5
Order By [name | age | gender | tel ] Display >>> name
name age gender tel
----------------------------
kale 29 f 10093
nick 22 m 10011
tony 18 m 10010
zhuima 25 f 10086
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 5
Order By [name | age | gender | tel ] Display >>> age
name age gender tel
----------------------------
tony 18 m 10010
nick 22 m 10011
zhuima 25 f 10086
kale 29 f 10093
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>>
3、完整代码
7、更新数据思路:
方法一: 使用字典重新赋值即可实现更新(本案例演示采用的第一种方式)
方法二: 根据索引找到对应的用户所在的dict,然后对整个dict进行更新根据索引找到对应的dict进行更新的案例演示In [38]: s
Out[38]: [{'age': 44, 'name': 'zhuima'}, {'age': 33, 'name': 'nick'}]
In [39]: for x in s:
....: if x['name'] == 'zhuima':
....: s[s.index(x)] = {'name':'zhuima521','age':28}
....:
In [40]: s
Out[40]: [{'age': 28, 'name': 'zhuima521'}, {'age': 33, 'name': 'nick'}]
In [41]:
1、代码片段def txl_update(status=True):
'''根据用户名对该用户的相关数据进行更新操作,用户名不可变,如果选项不更新,则保留默认值,否则更新'''
txl_disp()
name = raw_input('Select One Update By Name >>> ')
for line in txl:
if line['name'] == name:
status = False
old_age = line['age']
old_gender = line['gender']
old_tel = line['tel']
age = raw_input('Please Enter Your Age for %s >>> ' % name)
gender = raw_input('Please Enter Your Gender for %s >>> ' % name)
tel = raw_input('Please Enter Your Tel for %s >>> ' % name)
if len(age) == 0:
line['age'] = old_age
else:
line['age'] = age
if len(gender) == 0:
line['gender'] = old_gender
else:
line['gender'] = gender
if len(tel) == 0:
line['tel'] = old_tel
else:
line['tel'] = tel
break
if status:
print "Unkonw User,Try Again!"
txl_save()
2、测试结果[root@mysql01 day0330]# python v2_1.py
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
fuck 30 m 90000
kale 33 f 10093
tony 18 m 10010
zhuima 25 f 10086
max 32 f 20000
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 3
name age gender tel
----------------------------
fuck 30 m 90000
kale 33 f 10093
tony 18 m 10010
zhuima 25 f 10086
max 32 f 20000
Select One Update By Name >>> kale
Please Enter Your Age for kale >>>
Please Enter Your Gender for kale >>>
Please Enter Your Tel for kale >>> 99999
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 2
name age gender tel
----------------------------
fuck 30 m 90000
kale 33 f 99999
tony 18 m 10010
zhuima 25 f 10086
max 32 f 20000
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>> 3
name age gender tel
----------------------------
fuck 30 m 90000
kale 33 f 99999
tony 18 m 10010
zhuima 25 f 10086
max 32 f 20000
Select One Update By Name >>> min
Unkonw User,Try Again!
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
Please select one >>>
3、完整代码
总结至此,我们使用dict完成了数据库的增、删、改、查、排序等操作
完整代码#!/usr/bin/env python
#coding:utf8
#Author:zhuima
#Date:2015-03-22
#Version:0.1
#Function:display a list and add date
# 导入模块
import os
import cPickle
fname = 'contact.db'
txl = []
def menu():
'''设置munu目录,提供给用户的操作接口 '''
print '''
1.add user info
2.disp all user info
3.update user info by username
4:del user by username
5:sort user info by
0.exit program
'''
op = raw_input('Please select one >>> ')
return op
def txl_add():
'''添加用户'''
name = raw_input('Please Enter Your Name >>> ')
age = raw_input('Please Enter Your Age >>> ')
gender = raw_input('Please Enter Your Gender >>> ')
tel = raw_input('Please Enter Your Tel >>> ')
txl.append({'name':name,'age':age,'gender':gender,'tel':tel})
txl_save()
def txl_disp():
'''显示原始的txl列表 '''
if len(txl) > 0:
print "name age gender tel"
print '----------------------------'
for x in txl:
print "%(name)s %(age)s %(gender)s %(tel)s" % x
else:
print ">>> This is a empty file,There is no infomation! >>>"
def txl_save():
'''对数据进行写操作,写之前进行格式转换'''
s = cPickle.dumps(txl)
fp = file(fname,'w')
fp.write(s)
fp.close()
def txl_load():
'''对文件进行读取,如果文件存在的情况下 '''
if os.path.exists(fname):
fp = file(fname)
s = fp.read()
fp.close()
txl.extend(cPickle.loads(s))
def txl_update(status=True):
'''根据用户名对该用户的相关数据进行更新操作,用户名不可变,如果选项不更新,则保留默认值,否则更新'''
txl_disp()
name = raw_input('Select One Update By Name >>> ')
for line in txl:
if line['name'] == name:
status = False
old_age = line['age']
old_gender = line['gender']
old_tel = line['tel']
age = raw_input('Please Enter Your Age for %s >>> ' % name)
gender = raw_input('Please Enter Your Gender for %s >>> ' % name)
tel = raw_input('Please Enter Your Tel for %s >>> ' % name)
if len(age) == 0:
line['age'] = old_age
else:
line['age'] = age
if len(gender) == 0:
line['gender'] = old_gender
else:
line['gender'] = gender
if len(tel) == 0:
line['tel'] = old_tel
else:
line['tel'] = tel
break
if status:
print "Unkonw User,Try Again!"
txl_save()
def txl_del():
'''根据用户名进行删除用户相应的信息,并进行数据存储'''
name = raw_input('Please Enter Your Want To Delete name >>> ')
for line in txl:
if line['name'] == name:
txl.remove(line)
break
txl_save()
def txl_sort():
'''根据用户的输入对数据进行排序,用到了lambda函数 '''
op = raw_input('Order By [name | age | gender | tel ] Display >>> ')
txl.sort(key=lambda x : x[op])
txl_disp()
def txl_exit():
''' 退出程序 '''
os._exit(0)
def txl_error():
''' 当用户输出选项不在定义的选项内的时候,报错'''
print 'Unkonw options,Please try again!'
# 定义dict,配合函数实现switch功能
ops = {
'1':txl_add,
'2':txl_disp,
'3':txl_update,
'4':txl_del,
'5':txl_sort,
'0':txl_exit,
}
txl_load()
def main():
'''主程序 '''
while True:
op = menu()
ops.get(op,txl_error)()
if __name__ == '__main__':
main()