Python 三级菜单 增强版
需要实现的功能是:
三级菜单
1.从文本内读出选项
2.查询每一级的选项,并能对选项进行增/删/改功能
3.每一级可以退出程序或者返回上一层
2018-5-14 更新内容
思路

实现过程中的BUG及解决方案:
1. windowsError [Error 32]
说明:进程无法访问文件,因为另一个程序正在使用此文件。
解决:在对文件进行操作之前 进行关闭文件操作
代码实现:
FileRead.close()
FileWrite.close()
os.remove('city.txt')
os.renames('city_backup.txt','city.txt')
2 .ValueError: I/O operation on closed file
说明:操作的文件已经关闭
解决:在对文件进行读取内容或者写入内容之前打开文件
代码实现:
os.remove('city.txt')
os.renames('city_backup.txt','city.txt')
FileRead = io.open('city.txt', 'r', encoding='utf8')
FileWrite = open('city_backup.txt', 'w+')
3.TypeError: expected a string or other character buffer object
说明:数据类型与预定的数据类型不一致
解决:使用eval函数讲读取到的字符串转为字典,写入文件的时候用str函数将字典转为字符串
代码实现:
menu = eval(FileRead.read()) menucopy = str(menu) FileWrite.write(menucopy)
项目代码
#coding=utf-8
#__author:Administrator
#__time:2018/5/14 17:34
#__file_name:22222
import io
import os
Operation =['a','b','c','d','q','A','B','C','D','Q']
FileRead = io.open('city.txt', 'r', encoding='utf8')
FileWrite = open('city_backup.txt', 'w+')
menu = eval(FileRead.read())
def Judge(Province,municipality): #对菜单层级进行判断,返回该级菜单字典
if (Province == 0)and(municipality == 0): return menu
elif (Province != 0)and(municipality == 0): return menu[Province]
else : return menu[Province][municipality]
def OperationJudge(Province,city,choice): #对输入操作,决定下一步动作
if choice == 'b' and Province !=0 and city !=0 : shi(Province)
elif choice == 'b' and Province !=0 :shen()
elif choice == 'q': exit()
elif choice == 'd':FileDel(Province,city)
elif choice == 'c':FileChance(Province,city)
elif choice == 'a':FileAppend(Province,city)
def FileAppend(Province,municipality): #增加项目模块
MenuAppend = Judge(Province,municipality)
CityAppend = raw_input("请输入添加的城市\n",)
MenuAppend[CityAppend]={}
ExChange(Province,municipality)
def FileDel(Province,municipality): #删除项目模块
MenuDel = Judge(Province,municipality)
CityDel = raw_input("请输入你要删除的城市\n",)
MenuDel.pop(CityDel)
ExChange(Province,municipality)
def FileChance(Province,municipality): #改变项目模块
MenuChance = Judge(Province,municipality)
CityChance = raw_input("请输入被替换的城市\n",)
if CityChance in MenuChance : CityChanced = raw_input("请输入替换的城市\n",)
MenuChance[CityChanced] = MenuChance[CityChance]
MenuChance.pop(CityChance)
ExChange(Province,municipality)
def ExChange(Province,municipality): #对改变的项目写入文件当中进行保存
global FileRead,FileWrite
menucopy =str(menu)
FileWrite.write(menucopy)
FileRead.close()
FileWrite.close()
os.remove('city.txt')
os.renames('city_backup.txt','city.txt')
FileRead = io.open('city.txt', 'r', encoding='utf8')
FileWrite = open('city_backup.txt', 'w+')
if (Province == 0)and(municipality == 0): shen()
elif (Province != 0)and(municipality == 0): shi(Province)
else : xian(Province,municipality)
def shen(): #第一级菜单查找
for i in menu:print (i)
Province = raw_input('请输入你选择的省份\n',)
if Province in Operation : OperationJudge(0,0,Province)
elif (Province in menu) and menu[Province]!= {}: shi(Province)
elif Province not in menu :
print '请输入正确的省份\n'
shen()
elif menu[Province] == {} :
print "该省下面没有市,请添加\n"
FileAppend(Province,0)
elif Province == '':
print '请输入正确的省份\n'
shen()
def shi(Province): #第二级菜单查找
for i in menu[Province]: print (i)
city = raw_input('请输入你选择的市或退出程序(Q)或返回上一级菜单(B)\n')
if city in Operation : OperationJudge(Province,0,city)
elif (city in menu[Province])and (menu[Province][city]!={}):xian(Province,city)
elif city not in menu[Province] :
print '请输入正确的市\n'
shi(Province)
elif menu[Province][city] == {} :
print "该市下面没有县或区,请添加\n"
FileAppend(Province,city)
elif city == '':
'请输入正确的市\n'
shi(Province)
def xian(Province,city): #第三级菜单查找
for i in menu[Province][city]: print (i)
city2 = raw_input('请选择退出(Q)或返回(B)\n')
if city2 in Operation : OperationJudge(Province,city,city2)
else:
print '请输入正确的区或县\n'
xian(Province,city)
shen()
2018-5-13
思路
三个操作模块,分别是 增/删/改 功能
三个查询模块,分别对每一级别进行查询
报错信息:
Traceback (most recent call last):
File "E:/python/day8/three menu.py", line 79, in <module>
shen()
File "E:/python/day8/three menu.py", line 37, in shen
elif city == 'a':FileAppend(menu)
File "E:/python/day8/three menu.py", line 17, in FileAppend
ExChange()
File "E:/python/day8/three menu.py", line 47, in ExChange
FileWrite.write(menu)
TypeError: expected a string or other character buffer object
# -*- coding: UTF-8 -*-
#__filename:three menu
#__time:2018/5/13 22:04
import io
import os
FileRead = io.open('city','r',encoding='utf8')
FileWrite= open('city_backup','w+')
menu = eval(FileRead.read())
def FileAppend(MenuAppend):
CityAppend = raw_input("请输入添加的城市",)
MenuAppend['CityAppend']={}
ExChange()
def FileDel(MenuDel):
CityDel = raw_input("请输入你要删除的城市",)
MenuDel.pop('CityDel')
ExChange()
def FileChance(MenuChance):
CityChance = raw_input("请输入被替换的城市",)
if CityChance in MenuChance : CityChanced = raw_input("请输入替换的城市",)
MenuChance['CityChanced'] = MenuChance['CityChance']
MenuChance.pop('CityChance')
ExChange()
def shen():
for i in menu:print (i)
city = raw_input('请输入你选择的省份',)
if city == 'q': exit()
elif city == 'd':FileDel(menu)
elif city == 'c':FileChance(menu)
elif city == 'a':FileAppend(menu)
elif (city in menu) and (menu[city]!=0): shi(city)
elif menu[city]==0 :
print "该省下面没有市,请添加"
FileAppend(menu[city])
else:
print '请输入正确的省份'
shen()
def ExChange():
FileWrite.write(menu)
FileRead.close()
FileWrite.close()
os.remove('FileRead')
os.renames('FileWrite','FileRead')
def shi(city):
for i in menu[city]: print (i)
city1 = raw_input('请输入你选择的市或退出程序(Q)或返回上一级菜单(B)').strip()
if city1 == 'b':shen()
elif city1 == 'q':exit()
elif city1 == 'd':FileDel(menu[city])
elif city1 == 'c':FileChance(menu[city])
elif city1 == 'a':FileAppend(menu[city])
elif (city1 in menu[city])and (menu[city][city1]!=0):xian(city,city1)
elif menu[city][city1]==0 : FileAppend( menu[city][city1])
else:
'请输入正确的市'
shi(city)
def xian(city,city1):
for i in menu[city][city1]: print (i)
city2 = raw_input('请选择退出(Q)或返回(B) ')
if city2 == 'b': shi(city)
elif city2 == 'q': exit()
elif city2 == 'd':FileDel(menu[city][city1])
elif city2 == 'c':FileChance(menu[city][city1])
elif city2 == 'a':FileAppend(menu[city][city1])
else:
'请输入正确的区或县'
xian(city, city1)
shen()
Python 三级菜单 增强版的更多相关文章
- python三级菜单实例(傻瓜版和进阶版)
程序: python三级菜单 要求: : 1.打印省.市.县三级菜单 2.可返回上一级 3.可随时退出程序 方案一:傻瓜版(其实傻瓜版考察的主要是思路!思路清楚了,那才不是傻瓜!O(∩_∩)O哈哈~) ...
- python(5)- 简单练习:python三级菜单优化
python三级菜单优化,菜鸟版链接:http://www.cnblogs.com/xuyaping/p/6648170.html menu = { '北京':{ '海淀':{ '五道口':{ 'so ...
- Python学习-------------------三级菜单简单版
题目: 多级菜单 1.三级菜单 2.可依次选择进入的各子菜单 3.所需新知识点:列表.字典 ReadMe: 这个做循环,比较绕脑子 点开运行即可 Min ...
- python三级菜单的实现
一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...
- python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2
python编写一个三级while的循环菜单 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表. 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} shiqu_dir = {} ...
- [terry笔记]python三级菜单
把三级菜单输出,选择后逐层显示,”b“返回上一级菜单. menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村': ...
- python三级菜单
#-*- coding:utf-8 -*-#Author:gxli #一级菜单项def menu(): #遍历字典dic一级菜单 print('-----------一级菜单------------- ...
- Python 三级菜单与优化(一层循环嵌套)
优化的思路是使用单层循环嵌套完成三级菜单,这个优化思路我非常喜欢,我喜欢在编程的时候用最少的东西写出同样的效果,通常这样会绕来绕去,但非常有趣!!! 需求: 1.运行程序输出第一级菜单: 2.选择一级 ...
- Python——三级菜单
#三级菜单函数 menu = { '北京':{ 海淀:{ '五道口':{} '中关村':{} '上帝':{} } '昌平':{} '朝阳':{} '东城':{} }, '上海':{} '山东':{} ...
随机推荐
- objective-c中线程编程一例
/* print with threads : print every file's first n char contents under the path that pass to this pr ...
- python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结
Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小 ...
- 鹅厂优文|打通小程序音视频和webRTC
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯视频云终端技术总监常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ.QQ物联 等产品 ...
- jQuery学习小结
1.jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").clic ...
- mongodb3.6 (四)net 客户端如何连接、访问mongodb集群
前言 在是一篇文章mongodb如何做数据备灾 中已经介绍mongodb集群是如何工作,可能很多人都有这样一个疑问:客户端如何知道主服务挂了呢?这一篇文章将介绍如何在net中访问这个集群. 第一步.安 ...
- [ASP.NET MVC4高级编程] 学习记录(一)
理论: 先有GUI在发展,当用户按下某个键,某个进程会监听到这个动作,这个进程就是控制器.这就是MVC模式. 后来有了事件驱动编程,响应动作的是按钮本身,而不是控制器. 再后来webForm中,事件驱 ...
- Spring Cloud入门教程 - Zuul实现API网关和请求过滤
简介 Zuul是Spring Cloud提供的api网关和过滤组件,它提供如下功能: 认证 过滤 压力测试 Canary测试 动态路由 服务迁移 负载均衡 安全 静态请求处理 动态流量管理 在本教程中 ...
- andorid下从相册选取/拍照选取一张相片并剪切
http://www.2cto.com/kf/201401/270144.html 在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多 之前的一篇文章只说到如何从相册 ...
- JavaScript程序的执行顺序
JavaScript程序的执行顺序:同步==>异步==>回调 同步是阻塞模式,异步是非阻塞模式. 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个 ...
- kaggle入门项目:Titanic存亡预测 (一)比赛简介
自从入了数据挖掘的坑,就在不停的看视频刷书,但是总觉得实在太过抽象,在结束了coursera上Andrew Ng 教授的机器学习课程还有刷完一整本集体智慧编程后更加迷茫了,所以需要一个实践项目来扎实之 ...