day12 json数据、异常捕获等基操

2018-11-20  本文已影响0人  遇见那天的雨真大

1.json数据

1.什么是json数据

json是一种数据格式,满足json格式的数据就是json数据
文件后缀.json,并且文件中内容满足json格式

2.json格式

一个json中只有一个数据,并且这个数据是json支持的数据类型。
json支持的数据类型
数字类型 - 包含所有的数字,包括整数和小数。例如:100 12.05 -100
字符串 - 使用双引号括起来的字符集例如:"123" "abc"
布尔 - true和false、
数组 - 相当于python中的列表,使用中括号括起来,括号里面是json、支持的任意类型的数据
例如 ["abc",100,true,false]
字典 - 相当于Python中的字典,使用{}括起来,括号里面是键值对,键一般是字符串,值是json支持的任意类型
特殊值 - null(相当于None,表是空)“message”:null

3.python中有一个内置模块 json 用来支持对json文件的处理。

4.将son转换成python数据

loads(字符串) - 将json格式的数据转换成python对应的数据。
注意:字符串的内容必须是json支持的数据。

数字:整型或者浮点型
字符串:还是字符串(双引号转换成单引号)
布尔  布尔(true --》 True ,false --》False)
数组  列表
字典  字典
null  none
py2 = json.loads('"abc"')  #去掉引号之后还是json支持的格式
py1 = json.loads('100')  #去掉引号之后还是json支持的格式
print(py1,type(py1))
print(py2,type(py2))
py3 = json.loads('true')
print(py3)
py4 = json.loads('[100,"abc",true,null]')
print(py4)
py5 = json.loads('{"a":1,"b":2,"c":3}')
print(py5)
练习 取出成绩
py_dict = json.loads('{"data":'
                     '[{"name": "张三", "age": 18},{"name": "李四", "age": 20},{"name": "王五", "age": 19}],'
                     '"code": 200,"messages": null}')
data_list = py_dict["data"]
for item in data_list:
    if item["name"] == "王五":
        print("王五的年龄",item["age"])

with open("data.json",encoding="utf-8") as f:
    aa = f.read()
    py_data = json.loads(aa)
    data_list = py_data["data"]
    for item in data_list:
        if item["name"] == "王五":
            print("%sd的年龄是%s"%(item["name"],item["age"]))

5 将python数据转换成json数据

dumps(数据) - 将python数据转换成符合json格式的字符串
注意:最终结果是字符串

python json
int、float    数字
字符串    字符串(单引号变双引号)
布尔     布尔(True - true,False - false、)
列表/元组   数组
字典    字典
js1 = json.dumps(100)
print(js1,type(js1))
js2 = json.dumps("hello word")
print(js2)
js4 = json.dumps((10,"abc",True,None))
print(js4)
js5 = json.dumps([10,"abc",True,None])
print(js5)
js6 = json.dumps({'a':1,'b':2,'c':[10,"20"]})
print("js6",js6)
练习2 添加学生信息保存起来(姓名,n年龄,电话),并且上次添加的信息不会删除,下次再添加的时候是在上次基础上添加
flag = True
with open("stu_info.json",encoding="utf-8") as f:
    conten = f.read()
    all_students = json.loads(conten)  #这是一个列表
while flag:
    b = {}
    name = input("姓名:")
    b.update([["姓名",name]])
    age = input("年龄:")
    b.update([["年龄",age]])
    tel = input("电话:")
    b.update([["电话",tel]])
    all_students.append(b)
    with open("stu_info.json","w",encoding="utf-8") as f:
        js1 = json.dumps(all_students)
        f.write(js1)
    aaa = input("是否继续?是1,否2")
    if int(aaa) == 1:
        flag = True
    else:
        flag = False

6 .json文件操作相关方法

with open("stu_info.json",encoding="utf-8") as f:
    content = json.load(f)
    print(content)

with open("data.txt",encoding="utf-8") as f:
    content1 = json.load(f)
    print(content1)

# 封装自己的load方法,要求传入文件地址,就将文件对应的数据读出来,转换成python的数据。
def json_to_python(file):
    with open(file,encoding="utf-8") as f:
        py7 = json.loads(f.read())
    return py7
a = json_to_python('test22.json')
print(a)
# 封装自己的dump方法,要求传入数据写入需要创建的json文件名,
def python_to_json(obj,file_name):
    with open(file_name,"w",encoding="utf-8") as f:
        f.write(json.dumps(obj))
python_to_json([1,3,"aaa",{"name":"lorry","age":"23"}],"tset222.json")

2.异常捕获

1.什么是异常

程序执行过程中,也叫出现异常

2.异常捕获

让本来会奔溃的的位置,不出现异常,而是自己去处理异常出现的情况。

3.怎样捕获异常

结构一:捕获所有的异常

try:
    需要捕获异常的代码段1
except:
    代码段2
执行过程:执行代码段1,如果代码段1中出现异常,首先不会崩溃,而是马上执行代码段2.
如果代码段1没有异常,不会执行代码段2
try:
    print("****")
    print([1,2,3][10])
    print("////")
except:
    print("出现异常")
print("=======")

结构二:捕获指定异常

a.语法:
try:
    代码段1
except 错误类型名:
    代码段2
执行过程:当代码段1出现指定类型的异常后不崩溃,而是执行代码段2
try:
    print(int("abc"))
    print("****")
    print([1,2,3][10])
    print("////")
except ValueError:
    print("值出现异常")
print("=======")

try:
    print("****")
    print([1,2,3][10])
    print("////")
except IndexError:
    print("下标越界")
print("=======")

结构三:同时捕获多个异常,对不同的异常做出相同的反应

try:
    代码段1
exsept(错误类型1,错误类型2,错误类型3.。。。)
    代码段
执行过程:执行代码段1,当代码段1中出现指定的异常,不崩溃,然后执行代码段
try:
    # print([1,2][2])
    print({"a":1,}["bb"])
except (IndexError,KeyError,ValueError,StopIteration,FileNotFoundError):
    print("出现多种异常中的一个")
情况四:同时出现多种异常,对不同的做出不同的反应
try:
    代码段1
except 错误类型1:
    代码段2
escept 错误类型2:
    代码段3 
try:
    print([1,2][2])
except KeyError:
    print("建错误")
except ValueError:
    print("值错误")
except IndexError:
    print("下标越界")

重要:finally

try:
    print([1,2][1])
except:
    代码段2
finally:
    代码段3
不管代码段1中,也不管异常是否能捕捉,finally后面的代码段3都会执行。写遗书的作用
try:
   print([1,2][110])
except IndexError:
   print("下标越界")
finally:
   print("最后")

print("最后****")

什么时候使用异常捕获:
明明某段代码可能会出现异常,但是又没有办法避免,就可以使用异常捕获

练习 s输入成绩,知道输入的数据是正确的为止。
while True:
    try:
        score = float(input("输入成绩:"))
        break
    except ValueError:
        print("输入有误:")
        score = float(input("输入成绩:"))
封装一个函数,功能是获取指点文件中的内容(普通文本文件)
def capture_content(file):
    while True:
        try:
            with open(file,"r",encoding="utf-8") as f:
                content = f.read()
                return content
        except FileNotFoundError:
            print("未找到文件,请请重新输入")
            return " "
print(capture_content("静夜思.txt"))

3抛出异常

语法:
raise 错误类型 - 程序执行到raise的时候,直接抛出异常
注意:错误类型必须是一个类,并且这个类是Exception的子类

练习, 输入年龄,如果输入的年龄不在0-100,程序程序就崩溃。

age = input("请输入年龄:")
if int(age) > 100:
    raise ValueError
else:
    pass

class Ageerrro(Exception):
    def __str__(self):
        return "年龄越界了"
raise Ageerrro
上一篇 下一篇

猜你喜欢

热点阅读