#_*_coding:utf-8_*_
'''
写程序:多级菜单
需求:
1.现有省份、市、县3级结构,要求程序启动后,允许用户可依次选择进入各子菜单
2.可在任意一级菜单返回上一级
3.可以在任意一级菜单退出
Created on 2019年9月13日
@author: Administrator
'''
#利用openpyxl读写excel,注意这里只能是xlsx类型的excel
#安装的话,直接输入命令"pip install openpyxl"就行,很快就能安装完毕。
import openpyxl;
def loadSheet(rows,worksheet,areaDict):
#循环遍历该sheet页中每行记录
for i in range(rows):
#跳过第一行
if i<=0:
continue;
#获取第n行中的数据列表
row = [item.value for item in list(worksheet.rows)[i]];
prov = row[0]; #省份名称
city = row[1]; #地市名称
town = row[2]; #区县名称
#根据省份名称获取该省份对应的字典
cityD = areaDict.get(prov);
#如果能获取到,则寻找该字典中key为city的区县集合
if cityD: #如果找到了
townD = cityD.get(city); #获取该区县集合
#如果区县列表不为空,则将该区县元素添加到集合中,如果为空则新建一个集合并将其放入地市字典中
if townD: #如果找到了集合
townD.add(town); #将新的元素放入该集合中
cityD[city] = townD; #并将更新后的集合放回地市字典中
else: #如果没有找到区县集合
townD={town}; #将该区县放入一个新的集合中
cityD[city] = townD;#将该新的集合放入地市字典
else:
#print("没有获取到该省份[%s]对应的字典!" % prov);
cityD = {};
cityD[city] = {town};
areaDict[prov] = cityD;
return areaDict;
#检查入参
def checkInput(command):
result = 1;
if command == "quit":
result = -1;
elif len(command.strip())<=0:
print("不能为空,请重新输入!");
result = 0;
elif " " not in command and command != "1":
print("输入的值不合法,请输入1或者'菜单编号 名称'");
result = 0;
elif " " in command:
result = 1;
return result;
#从用户选择的上级菜单返回下级菜单列表集合
def getDictListFromUserSelect(areaDict,name,level):
if level == 1 and len(name)<=0:
print("省份");
for key in areaDict.keys():
print("%s" % key);
elif level == 1 and len(name)>0:
cityDict = areaDict.get(name);
if cityDict:
print("省份--地市");
print(name);
for key in cityDict.keys():
print("----%s" % key);
else:
print("对不起,您输入的【%s】有误查不到,请重新输入!" % name);
elif level == 2 and len(name)>0:
noon = True;
for key,values in areaDict.items():
townDict = values.get(name);
if townDict:
noon = False;
print("省份--地市--区县");
print(key);
print("----%s" % name);
for town in townDict:
print("--------%s" % town);
else:
continue;
if noon:
print("对不起,您输入的【%s】有误查不到,请重新输入!" % name);
return;
#主函数入口
if __name__ == "__main__":
print("1.开始执行主程序...");
#定义一个地域字典
areaDict={};
#加载城市列表数据
filename = "D:\java\workspace\Python_001\省市县区.xlsx";
workbook = openpyxl.load_workbook(filename);#加载文件
worksheet = workbook.get_sheet_by_name("省市县区");#获取第一个sheet页
rows = worksheet.max_row;#获取最大行号
print("2.调用加载xlsx文件的函数加载字典...")
areaDict = loadSheet(rows,worksheet,areaDict);
print(areaDict);
print("3.与用户交互获取用户要查询的省份、地市、区县...");
print("==========================================================")
print('''
省份--地市--区县
请模拟用户选择地域菜单的动作,输入两个值中间用空格分隔,第一个值为数字(1,2,3),分别代表选择
哪一列;第二个值为具体的名称。必须从第一个菜单开始选择,否则无法进行。首次选择时可以只输入1,
二次选择时,必须输入菜单号和菜单中的名称。
例如:1
1 河北省
2 银川市
''')
print("==========================================================")
goon = True;
while goon:
command = input("请模拟选择菜单动作,1,2,3分别代表三级目录,选择一级时不需要输入名称:");
flag = checkInput(command);
if flag == -1:
print("用户退出!");
goon = False;
break;
elif flag == 0:
continue;
else:
name="";
level = 1;
if " " in command:
arry=command.split(" ");
name = arry[1];
try:
level = int(arry[0]);
except:
level = 1;
getDictListFromUserSelect(areaDict,name,level);
workbook.close();
运行效果如下:
总结:
1.读取excel文件:需要安装openpyxl类库。
利用openpyxl读写excel,注意这里只能是xlsx类型的excel
安装的话,直接输入命令"pip install openpyxl"就行,很快就能安装完毕。
import openpyxl;
filename = "D:\省市县区.xlsx";
workbook = openpyxl.load_workbook(filename);
worksheet = workbook.get_sheet_by_name("省市县区");
rows = worksheet.max_row;
row3=[item.value for item in list(worksheet.rows)[2]]
print('第3行值',row3)
col3=[item.value for item in list(worksheet.columns)[2]]
print('第3行值',col3)
cell_2_3=worksheet.cell(row=2,column=3).value
print('第2行第3列值',cell_2_3)
省市县区.xlsx参见资源中附件
2.函数的定义
def 函数名(参数):
函数体...
return 返回值
3.字符串的相关处理
s = " and ddeeewx ";
#1.大写变小写,小写变大写
s.swapcase();
#2.首字母大写
s.capitalize();
#3.忽略大小写
s.casefold();
#4.字符串居中总长度为50,不够的补充*
s.center(50,'*');
#5.统计目标字符在字符串中出现的次数
s.count('0',0,5);
#6.将tab键长度变为指定的数值
s.expandtabs(20);
#7.查找字符串,没有返回-1
s.find('0');
#8.字符串格式化
s='I am {0} ,age is {1}';
s.format('alex',22);
s='I am {name}, age is {age}';
s.format(name='掌声',age=22);
#9.去除空格和tab
s.strip(); 去除首尾的空格
s.lstrip();去除左侧的空格
s.rstrip();去除右侧的空格
#10.字符串拆分
comand = "1 北京";
arr = command.split(" "); #使用空格拆分字符串
code = arr[0];
name = arr[1];
#11.两个字符串比较使用==
a = " zhangsan ";
b = "zhangsan";
if a == b:
then True;
else:
False;
#12.判断字符串中是否含有某个字符
a = "zhangsan@lisi";
if "@" in a:
then True;
else:
False;