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 = { '北京':{ 海淀:{ '五道口':{} '中关村':{} '上帝':{} } '昌平':{} '朝阳':{} '东城':{} }, '上海':{} '山东':{} ...
随机推荐
- android Material Design详解
原文地址:http://blog.csdn.net/jdsjlzx/article/details/41441083/ 前言 我们都知道Marterial Design是Google推出的全新UI设计 ...
- 快速熟悉Oracle索引
一.索引 1.1 什么是索引? 一种用于提升查询效率的数据库对象: 通过快速定位数据的方法,减少磁盘的输入输出操作: 索引信息与表独立存放: Oracle数据库自动使用和维护索引. 1.2 索引分类 ...
- 不容忽视的js面试题
1.全局变量和局部变量(变量提升和连等赋值问题) (function() { var a = b = 5; })(); console.log(a); console.log(b); 上面代码运行结果 ...
- Spring Boot 2.0系列文章(七):SpringApplication 深入探索
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/30/springboot_SpringApplication/ 前言 在 Spring B ...
- JVM学习--(六)类加载器原理
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...
- MongoDB学习笔记(二)
一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果database和collect ...
- Thread.yield和join方法
参考:http://blog.csdn.net/dabing69221/article/details/17426953 一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变 ...
- C++string函数之strcpy_s
strcpy_s和strcpy()函数的功能几乎是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串.在程序运行时,这将导致 ...
- css 字体两端对齐
我想作为一个前端工作者,总会遇到这样的场景,一个表单展示的字段标题有4个字也有2个字的时候,这样子同时存在想展示的美观一点,就需要字体两端对齐了,其实实现方式很简单,我针对其中一种来做下介绍,以后方法 ...
- Spring Boot实战:模板引擎
虽然现在很多开发,都采用了前后端完全分离的模式,即后端只提供数据接口,前端通过AJAX请求获取数据,完全不需要用的模板引擎.这种方式的优点在于前后端完全分离,并且随着近几年前端工程化工具和MVC框架的 ...