第二十一天包和异常处理
1.json的格式化功能:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import json data={'username':['梨花','二愣子'],'sex':'male','age':15} json_dic2=json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2) 结果为 { "age":15, "sex":"male", "username":[ "梨花", "二愣子" ] }
注;ensure_ascii 当它为True 的时候,所有的非ascii码显示为\uxxxx序列,只需要在调用dump时将ensure_ascii设置成为False既可以显示正常的中文文字
separators 分隔符,实际上是(item_separator,dic_separator)的一个元组,默认就是(',',':'),这表示dictionary内keys之间用逗号隔开,而keys和values之间用冒号隔开。
sor_keys:将数据根据keys的值进行排序
2.包的讲解:
2.1创建多个文件(包就是文件里含有__init__.py文件就是)(把解决同一类问题的模块放在同一个文件夹中成为包)(如果创建的文件已经存在,在进行编译会报错)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os os.makedirs('glance/api') os.makedirs('glance/cmd') os.makedirs('glance/db') l=[] l.append(open('glance/__init__.py','w')) l.append(open('glance/api/__init__.py','w')) l.append(open('glance/api/policy.py','w')) l.append(open('glance/api/versions.py','w')) l.append(open('glance/cmd/__init__.py','w')) l.append(open('glance/cmd/manage.py','w')) l.append(open('glance/db/models.py','w')) map(lambda f:f.close() ,l)
结果为
3.在python中创建包的过程:
4.关于包相关的调用可以使用import 和from ...import 两种,但是无论使用哪一种,无论在什么位置,再导入时必须遵循凡是导入时带点的,点的左边必须是一个包。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import glance.api.policy as t t.get() 结果为 from policy.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from glance.api import policy policy.get() 结果为 from policy.py
5. 如果要是把glance文件移动到一个新的文件下这些操作执行的方法为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from glance.api import policy policy.get() 结果为 from glance.api import policy policy.get()
解决方法1.是是把文件路径加进去
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os import sys ret=os.getcwd() ret1=os.path.join(ret,'dir') #把dir的文件路径加进去 sys.path.append(ret1) from glance.api import policy policy.get() 结果为 from policy.py
6.怎么通过调用fromglance来进行调用模块:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import glance #执行此语句会执行glance里的init文件里的命令 结果为 输出_init+方法:
6.1通过上述我们可以把所调用的写在每一个init文件中:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import glance #执行此语句会执行glance里的init文件里的命令 glance.cmd.manage.main() 结果为 fjdkjfdkjf
7.如果glance移动了,6的方法就没有办法继续使用:需要在每一个init里添加dir目录:或者在sys.path里吧这个文件路境添加进去
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import glance glance.api 结果为 import glance ModuleNotFoundError: No module named 'glance
8.使用绝对路径可以改变文件移动的问题:
9.总结:使用绝对路径,不管在包内还是外部导入就能使用,但是文件不能挪动,很直观。
使用相对路径:可以随意挪动包,只要能找到包的位置,就可以使用包里的模块,包里的模块如果想其他的内容只能使用相对路径,使用了相对路径不能在包内直接执行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from dir import glance glance.db.models.modle() 结果为 fjdkjfkjd
9.使用__all__来控制from...import *
10异常错误有两种:语法错误(这种错误过不了python解释器)逻辑错误(会在程序执行的过程中报错)
11.程序一旦发生错误,就从错误位置停下来,不在执行后面的内容:
12.第一种排除异常错误继续执行下面程序的方法:try.....except
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try: ret=int(input('number...')) print(ret*'*') except ValueError: #如果try里面的内容有错误就会执行此语句反之不执行 print('你输入的内容有误,请输入一个数字:') 结果为 number...1 * number...a 你输入的内容有误,请输入一个数字:
13.可以写一个try多个except
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try: #符合哪个条件执行哪一个 list1=[1,3] list1[4] except ValueError: #如果try里面的内容有错误就会执行此语句反之不执行 print('你输入的内容有误,请输入一个数字:') except IndentationError: print('超出范围') 超出范围
14Exception 可以处理任何的错误:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try: #符合哪个条件执行哪一个 list1=[1,3] list1[4] except Exception as error: #如果try里面的内容有错误就会执行此语句反之不执行 print('你输入的内容有误,请输入一个数字:',error) 你输入的内容有误,请输入一个数字: list index out of rangetry: #符合哪个条件执行哪一个 int('a') except Exception as error: #如果try里面的内容有错误就会执行此语句反之不执行 print('你输入的内容有误,请输入一个数字:',error) 你输入的内容有误,请输入一个数字: invalid literal for int() with base 10: 'a'
15.else的用法;只有·程序正确的时候才会执行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try: ret=int(input('请输入一个数')) print(ret*'*') except ValueError: #把所能发现的错误类型都写下来 print('输入的数据类型有误:') except IndexError: print('超出文件的范围') except Exception as error: #最后一个写万能错误类型 print(error) else: #当程序对的时候执行此语句 print('可以执行else语句')
16.finally无论程序的正确与错误都会执行此动作:(主要用于文件的操作和数据库操作)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try: ret=int(input('请输入一个数')) print(ret*'*') except ValueError: #把所能发现的错误类型都写下来 print('输入的数据类型有误:') except IndexError: print('超出文件的范围') except Exception as error: #最后一个写万能错误类型 print(error) else: #当程序对的时候执行此语句 print('可以执行else语句') finally: print('可以执行finally此语句') 结果为 请输入一个数1 * 可以执行else语句 可以执行finally此语句 请输入一个数a 输入的数据类型有误: 可以执行finally此语句
17finally’和return相遇时会执行完finally之后在执行return语句
18.常遇到的错误类型:
19.三级菜单问题:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
menu = { '北京':{ '朝阳':{ '国贸':{}, 'CICC':{}, 'HP':{}, '渣打银行':{}, 'CCTV':{}, }, '望京':{ '陌陌':{}, '奔驰':{}, '360':{}, }, '三里屯':{ '优衣库':{}, 'apple':{}, }, '昌平':{ '沙河':{ '老男孩':{}, '阿泰包子':{}, }, '天通苑':{ '链家':{}, '我爱我家':{}, }, '回龙观':{}, }, '海淀':{ '五道口':{ '谷歌':{}, '网易':{}, 'sohu':{}, '快手':{}, }, '中关村':{ 'youku':{}, 'Iqiyi':{}, '汽车之家':{}, '新东方':{}, 'QQ':{}, }, }, }, '上海':{ '浦东':{ '陆家嘴':{ 'CICC':{}, '高盛':{}, '摩根':{}, }, }, '闵行':{}, '静安':{}, }, '山东':{ '济南':{}, '德州':{ '乐陵':{ '丁务镇':{}, '城区':{}, }, '平原':{}, }, '青岛':{}, }, } def threeLM(dic): while True: for k in dic:print(k) key=input('input<<<').strip() if key=='b'or key=='q':return key elif key in dic.keys() and dic[key]: ret=threeLM(dic[key]) if ret=='q':return 'q' elif (not dic.get(key))or (not dic[key]): continue threeLM(menu)