【python之路】【4、文件操作】数据类型、文件操作-作业 用文件储存三级菜单并执行
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 # __author__:"watalo" 4 # date: 2019/9/23 5 6 ''' 7 1.用文件操作的方式实现三级菜单,用户可增、删、改、查(1级1级的做) 8 2.需要用的函数: 9 str(),字典转字符串 10 eval(),字符串直接调用引号里的内容,内容是字典话,那就。。。 11 OK,let's go! 12 【idea&question:】 13 1、直接在文件里写好省、市、区名字? 14 开头就出现问题,省市区分文件写,还是写在一个文件,分文件写又应该怎么写,难道每个市都要单独命名一个文件?这TM是个问题啊 15 1.1、为了自动搞出这些名字来,我决定加一个作业,就是用for循环来写,市的名字简化成 省名_1,区名字简化为,省名_1_1这样。 16 写一个menu()函数来实现。for循环已经循环晕了。 17 2、将文件内容变成字典类型,逐渐添加形成一个大字典 18 3、用之前学的字典三级菜单(高大上版)循环。>>>>>>>>>>实现了三级菜单的‘查’功能 19 4、考虑怎么做增、删、改,基本想法是在while循环的过程中添加功能。 20 可以预期的问题,改完后,只是对字典进行了修改,【字典】中的内容怎么返还回去改【文件】。 21 ''' 22 23 # 1、自动生成文件 24 def menu(a): # 用a文件里单行内容为名字,生成新文件,并且给新文件添加内容为 25 b = str(a) 26 with open(b, 'r', encoding='utf-8') as m: 27 for prov in m: 28 with open(prov.strip(), 'w', encoding='utf-8') as p: # 创建以省命名的文件 29 for i in range(1, 3): 30 city = str(prov.strip()) + '' + str(i) + '\n' # 格式化城市名称 31 p.writelines(city) # 写入格式化城市名称 32 33 menu('prov') # 生成市级文件 34 with open('prov', 'r', encoding='utf-8') as m: # 生成区级文件 35 for key in m: 36 menu(key.strip()) 37 38 39 # 2、通过文件生成一个字典 40 def file_to_dict(a=str(),b={}): 41 menu_dict = dict() 42 with open(a, 'r', encoding='utf-8') as m: 43 for key in m: 44 menu_dict.setdefault(key.strip(), {}) 45 return menu_dict 46 47 dict_menu = file_to_dict('prov') 48 for key in dict_menu: 49 dict_menu[key] = file_to_dict(key) 50 m = dict_menu[key] 51 for key2 in m: 52 m[key2] = file_to_dict(key2) 53 54 # 3、3级菜单循环 55 def foldedmenu(dict_menu_c): 56 # dict_menu_c = dict_menu #有预感这句话 换个名字对后面‘增删改’功能会有很大的作用 57 parent_layer = [] 58 while True: # 生成一个循环loop 59 for key in dict_menu_c: # 遍历字典的键值,也就是第一层字典key 60 print(key) # 显示出来 61 choice = input('>>>:').strip() # 输入显示出来的第一层,或者 b 返回 62 if len(choice) == 0: continue # 基本判断,确保没有输入东西的时候重复 63 if choice in dict_menu_c: 64 parent_layer.append(dict_menu_c) # 当前层级的字典,直接添加到 列表里面备用 65 dict_menu_c = dict_menu_c[choice] # 循环赋值给dict_menu_c,用于进入下一个层级 66 elif choice == 'b': 67 if parent_layer: # [] 空列表 就是 False 68 dict_menu_c = parent_layer.pop() # 取出列表的最后一个值 69 elif choice == 'q': 70 print('--------END---------') 71 break 72 else: 73 print('请正确输入指令') 74 75 foldedmenu(dict_menu)