美文网首页
Python基础 - json文件和异常捕获

Python基础 - json文件和异常捕获

作者: 莫名ypc | 来源:发表于2018-10-15 20:25 被阅读0次

    知识回顾

    1.容器类型

    列表:[元素];可变的,有序;任意类型;增删改查
    字典:{键值对};可变的,无序;key不可变并且唯一,value是任意类型;增删改查
    元组:(元素,);不可变,有序;任意类型;查

    x, y = (10, 20)
    tuple1 = 10, 'abc', 30
    x, *number = 1, 2, 3, 4, 5
    x = (10,)
    

    集合:{元素};可变的,无序;不可变且唯一;数学集合运算
    迭代器:无字面量;只能next去取值,取出后值就不存在了;iter(),生成器

    2.函数

    函数的声明
    不定长参数:(*arg, **kwargs)
    函数的调用:a.调用过程 b.调用函数就是为了执行函数体,并且获取返回值
    匿名函数:lambda 参数列表:返回值
    函数作为变量:声明函数就是在声明一个类型是function的变量
    变量的作用域:全局变量和局部变量
    递归:自己调用自己;三步:a.找临界值 b.找关系:f(n)和f(n-1)的关系 c.用f(n-1)实现f(n)的功能
    生成器:有yield关键字的函数;
    (值1, 值2 for 变量 in 序列 条件语句)

    3.文件操作

    打开文件 - 操作文件 - 关闭文件
    open(文件的地址, 打开方式,encoding = 编码方式) --> 返回被打开的文件对应的文件对象
    r/rb --> 读
    w/wb --> 写
    a --> 写(追加)

    文件操作

    补充:打开文件的时候是以读的时候打开,如果文件不存在会报错:FileNotFoundError
    打开文件的时候是以写的方式打开。如果文件不存在会自动创建对应的文件

    打开文件和关闭文件的缩写

    with open(文件路径, 打开方式, encoding = 编码方式) as 文件对象:
        文件操作相关的代码
    

    说明:打开文件,执行完文件操作相关的代码后,会自动关闭打开的这个文件

    
    # open('./files/aaa.txt', 'w')
    
    with open('./files/aaa.txt', 'w', encoding='utf-8') as f1:
        f1.write('床前明月光\n疑是地上霜')
    
    

    1.二进制文件的读和写

    常见的二进制文件:视频文件、音频文件、图片、压缩包等都是属于二进制文件

    bytes --> 字节,是python专门用来表示二进制的数据类型

    注意:二进制文件不能设置文件编码方式(不能给encoding赋值)

    with open('./files/xueqi.jpg', 'rb') as f2:
        content = f2.read()
        print(type(content), content)
    
    with open('./files/new.jpg', 'wb') as f3:
        f3.write(content)
    

    json文件

    json是一种特定格式的数据,主要用来在互联网上做数据传输。

    json数据本身 是文本数据,json文件就是后缀.json的文件,并且文件内容必须满足json格式的要求

    1.json格式

    a.一个json对应一条数据
    b.json中的数据必须是json对应的数据类型

    数据类型 说明
    数字类型(number) 所有的数字,包含整数和小数
    字符串类型(string) 用双引号括起来的数据
    数组(array) 相当于python中的列表
    字典(dictionary) 相当于python中的字典
    布尔 true和false
    null 相当于None,用来表示空

    2.python 对json的支持

    python中专门提供一个json模块,用来处理json数据
    load(json文件路径) --> 将json文件的内容读出来,并且将内容转换成python对应的数据类型
    dump(内容,json文件路径) --> 将指定的内容,以json格式写入到指定的json文件中

    loads(json格式字符串) --> 将字符串内容是json数据的字符串转换成python对应的数据类型数据
    dumps(内容) --> 将指定的内容,转换成json格式的字符串

    json转换成python

    json python
    json python
    数字 int/float
    " " 字符串

    1.loads

    loads(字符串) --> 要求字符串的内容必须满足json格式

    import json
    
    content = json.loads('100')
    print(content, type(content))
    
    content = json.loads('"aaa"')
    print(content, type(content))
    
    content = json.loads('[15, 20, "name", [1, "2a"]]')
    print(content, type(content))
    print(type(content[3]))
    
    content = json.loads('{"a":1, "b":2, "c": true}')
    print(content, type(content))
    

    2.load

    load(文件对象) --> 将文件对象中的内容转换成python数据类型数据。要求文件中的内容必须是json格式的数据

    with open('./files/test.json') as f:
        print(json.load(f))
    
    

    python 转json

    python json
    python json
    int/float 数字
    True/False true/false
    str 字符串(将单引号转换成双引号)
    dict 字典
    list/tuple 数组
    None null

    注意:除了上面列出的类型,其他类型不能直接转换成json格式的数据

    3.dumps

    dumps(内容) --> 内容是python数据,返回值是一个字符串,并且字符串的内容满足是json格式的

    str1 = (json.dumps({'a': 1, 'b': True}))
    print(str1, type(str1))
    

    4.dump

    dump(内容,文件对象) --> 将内容以json格式写入文件中

    with open('./files/test2.json', 'w') as f:
        json.dump({'a': 1, 'b': 2, 'c': True}, f)
    

    文件的使用

    数据本地化的过程:使用数据的时候从本地文件中去取数据;修改完数据后要使用新的数据去更新本地文件中的内容

    学生管理系统

    1.添加学生,要求之前添加过的学生,下次执行程序的时候还存在
    2.显示学生信息

    学生管理数据类型 --> [学生1, 学生2 ], {'学号1': 学生1, '学号1': 学生2}

    # 保存所有的学生
    import json
    with open('./files/student.json') as f:
        all_student = json.load(f)
    
    
    def add_student():
        """
        添加学生
        :return:
        """
        while True:
            name = input('请输入学生的姓名:')
            age = input('请输入学生的年龄:')
            tel = input('请输入学生的电话:')
            # 创建学生对应的字典
            student = {'name': name, 'age': age, 'tel': tel}
            # 将学生添加到容器中
            all_student.append(student)
            # 将新的数据更新到本地文件中
            with open('./files/student.json', 'w') as f:
                json.dump(all_student, f)
            print('添加成功')
            print('1.继续添加')
            print('2.返回上一层')
            input_value = input('请选择(1-2):')
            if input_value == '1':
                continue
            else:
                break
    
    
    def show_student():
        for student in all_student:
            print(student)
    
    
    while True:
        print('1.添加学生')
        print('2.显示学生')
        print('3.退出')
        input_value = input('请输入(1-3):')
        if input_value == '1':
            print('添加学生')
            add_student()
        elif input_value == '2':
            print('显示学生信息')
            show_student()
        else:
            print('退出成功!')
            break
    
    

    1.在程序中声明一个变量用来保存当前程序执行的次数

    with open('./files/num.json') as f:
        num = json.load(f)
    
    print('第', num['num'], '次')
    n = num['num']
    num['num'] = n + 1
    
    with open('./files/num.json', 'w') as f:
        json.dump(num, f)
    

    异常捕获

    1.报错 --> 出现异常(后面的代码不会执行,并且程序会直接结束)

    2.异常捕获

    出现异常后,不希望程序直接崩溃,而是想要自己对这个异常进行处理,就需要捕获异常

    格式1(可以捕获代码段1中的所有类型的异常):

    try:
        代码段1
    except:
        代码段2
    finally:
        代码段3
    

    说明:执行代码段1并且检测代码段1是否发生异常,如果发生异常程序不崩溃而是直接执行代码段2

    try:
        # value = input('输入数字:')
        value = 1
        int_value = int(value)
    except:
        print('出现异常')
    
    

    格式2:

    try:
        代码段1
    except 异常类型:
        代码段2
    finally:
        代码段3
    

    说明:捕获代码段1中出现的指定类型的异常

    try:
        print([1, 2][2])
    except IndexError:
        print('出现异常2')
    
    try:
        代码段1
    except (异常类型1, 异常类型2, ...):
        代码段2
    finally:
        代码段3
    

    说明:捕获except后的括号中所有的异常

    try:
        print([1, 2][3])
        print({'a': 1}['b'])
    except (KeyError, IndexError):
        print('异常3')
    

    格式4:

    try:
        代码段1
    except 异常类型1:
        代码段2
    except 异常类型2:
        代码段3
    ...
    finally:
        代码段4
    
    try:
        print([1, 2][3])
        print({'a': 1}['b'])
    except IndexError:
        print('下标越界')
    except KeyError:
        print('key不存在')
    

    finally后面的代码段一定会执行,不管try里面的代码是否会出现异常,以及出现异常后异常是否被捕获

    try:
        open('./files/abcdef.txt')
    except FileNotFoundError:
        print('文件不存在!')
    finally:
        print('最后会执行的代码')
    
    # 抛出异常
    """
    raise 异常类型
    """
    value = int(input('请输入一个偶数'))
    if value & 1:
        raise ValueError
    else:
        print('正确')
    

    异常类型要求:是Exception类的子类

    作业 - 学生信息管理系统

    数据本地化 + 登录注册

    import json
    
    with open('./files/student.json') as f:
        all_student = json.load(f)
    
    with open('./files/admin.json') as f:
        all_admin = json.load(f)
    
    
    def create_id():
        for x in range(9999):
            yield x + 1
    
    
    id = create_id()
    
    
    def select_add():
        n = input('请输入:')
        if n == '1':
            add_student()
        elif n == '2':
            menu()
        else:
            print('输入有误!重新输入')
            select_add()
    
    
    def add_student():
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃            添加学生信息           ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        class_name = 'py1807'
        name = input('姓名:')
        age = input('年龄:')
        tel = input('电话:')
        stuid = next(id)
        new_id = str(stuid).rjust(4, '0')
        stu_id = class_name + new_id
        student = {'name': name, 'age': age, 'tel': tel, 'stu_id': stu_id}
        all_student.append(student)
        with open('./files/student.json', 'w', encoding='utf-8') as f:
            json.dump(all_student, f)
        print('1.继续添加')
        print('2.返回菜单')
        select_add()
    
    
    def query_student():
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃            查看学生信息           ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        print('1.查看所有学生信息')
        print('2.按姓名查找')
        print('3.按学号查找')
        print('4.返回')
        n = input('请输入:')
    
        def query_all():
            if all_student:
                for student in all_student:
                    print(student)
                print('')
            else:
                print('没有学生信息')
            print('')
            print('1.返回上层')
            print('2.返回主菜单')
            n = input('请输入:')
            if n == '1':
                query_student()
            elif n == '2':
                menu()
            else:
                print('输入有误')
                query_all()
    
        def query_name(name):
            count = 0
            for index in range(len(all_student)):
                if all_student[index]['name'] == name:
                    print(all_student[index])
                    count += 1
            if not count:
                print('没有信息')
                print('')
            print('1.返回上层')
            print('2.返回主菜单')
            n = input('请输入:')
            if n == '1':
                query_student()
            elif n == '2':
                menu()
            else:
                print('输入有误')
                query_name()
    
        def query_id(stuid):
            if all_student:
                count = 0
                for index in range(len(all_student)):
                    if all_student[index]['stu_id'] == stuid:
                        print(all_student[index])
                        count += 1
                        break
                if count == 0:
                    print('没有此学号对应的学生!')
            else:
                print('没有信息')
                print('')
            print('1.返回上层')
            print('2.返回主菜单')
            n = input('请输入:')
            if n == '1':
                query_student()
            elif n == '2':
                menu()
            else:
                print('输入有误')
                query_id()
        if n == '1':
            query_all()
        elif n == '2':
            name = input('输入要查找的姓名:')
            query_name(name)
        elif n == '3':
            stuid = input('输入要查找的学号:')
            query_id(stuid)
        elif n == '4':
            menu()
        else:
            print('输入有误,重新输入')
            query_student()
    
    
    def del_student():
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃            删除学生信息           ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        print('1.按学号删除')
        print('2.按姓名删除')
        print('3.返回')
    
        def del_student_id():
            if all_student:
                stuid = input('输入你要删除的学生学号:')
                count = 0
                for student in all_student:
                    if student['stu_id'] == stuid:
                        all_student.remove(student)
                        print('删除成功!')
                        count += 1
                        break
                if not count:
                    print('没有对应学号的学生!')
                del_student()
            else:
                print('没有学生信息')
                del_student()
    
        def del_student_name():
            if all_student:
                name = input('输入你要删除的学生的姓名:')
                count = 0
                for student in all_student:
                    if student['name'] == name:
                        count += 1
                if count == 1:
                    for student in all_student:
                        if student['name'] == name:
                            all_student.remove(student)
                            with open('./files/student.json', 'w', encoding='utf-8') as f:
                                json.dump(all_student, f)
                            print('删除成功!')
                            break
                elif count > 1:
                    name_student = []
                    num = 1
                    for student in all_student:
                        if student['name'] == name:
                            student['no'] = num
                            name_student.append(student)
                            num += 1
                    print('姓名', name, '的学生信息:')
                    print(name_student)
                    num2 = int(input('输入要删除的序号:'))
                    for index in name_student:
                        if index['no'] == num2:
                            for student in all_student:
                                if student['stu_id'] == index['stu_id']:
                                    all_student.remove(student)
                                    with open('./files/student.json', 'w', encoding='utf-8') as f:
                                        json.dump(all_student, f)
                                    print('删除成功!')
                                    break
                elif count == 0:
                    print('没有你要删除的姓名对应的学生!')
                del_student()
            else:
                print('没有学生信息')
                del_student()
        n = input('请输入:')
        if n == '1':
            del_student_id()
        elif n == '2':
            del_student_name()
        elif n == '3':
            menu()
        else:
            print('输入有误!')
            del_student()
    
    
    def alter_student():
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃            修改学生信息           ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        print('1.按学号修改')
        print('2.返回')
    
        def alter_student_id():
            stuid = input('请输入要修改的学生的学号')
            print(stuid)
            for student in all_student:
                if student['stu_id'] == stuid:
                    print('将要修改的学生信息:')
                    print(student)
    
                    def sele_item():
                        print('修改项:')
                        print('1.姓名')
                        print('2.年龄')
                        print('3.电话')
                        print('4.取消修改')
                        item = input('请输入你想要修改的项:')
                        if item == '1':
                            new_name = input('新的姓名:')
                            print(new_name)
                            student['name'] = new_name
                            with open('./files/student.json', 'w', encoding='utf-8') as f:
                                json.dump(all_student, f)
                            print('修改姓名成功')
                            return
                        elif item == '2':
                            new_age = input('新的年龄:')
                            print(new_age)
                            student['age'] = new_age
                            with open('./files/student.json', 'w', encoding='utf-8') as f:
                                json.dump(all_student, f)
                            print('修改年龄成功')
                            return
                        elif item == '3':
                            new_tel = input('新的电话:')
                            print(new_tel)
                            student['tel'] = new_tel
                            with open('./files/student.json', 'w', encoding='utf-8') as f:
                                json.dump(all_student, f)
                            print('修改电话成功')
                            return
                        elif item == '4':
                            alter_student()
                        else:
                            print('输入有误!')
                            sele_item()
    
                    sele_item()
                else:
                    print('没有此学号的学生!')
    
            alter_student()
        n = input('请输入')
        if n == '1':
            alter_student_id()
        elif n == '2':
            menu()
        else:
            print('输入有误!')
            alter_student()
    
    
    def login():
        username = input('用户名:')
        password = input('密码:')
        for admin in all_admin:
            if admin['username'] == username:
                if admin['password'] == password:
                    menu()
                    return
                else:
                    print('密码错误!')
                    return
        print('用户名不存在!')
        return
    
    
    def register():
        username = input('用户名:')
        password = input('密码:')
        admin = {'username': username, 'password': password}
        all_admin.append(admin)
        with open('./files/admin.json', 'w', encoding='utf-8') as f:
            json.dump(all_admin, f)
        print('注册成功,去登录吧!')
        return
    
    
    def menu():
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃                                               ┃')
        print('┃             欢迎进入学生信息管理系统              ┃')
        print('┃                                               ┃')
        print('┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫')
        print('┃                1.添加学生信息                   ┃')
        print('┃                2.修改学生信息                   ┃')
        print('┃                3.删除学生信息                   ┃')
        print('┃                4.查找学生信息                   ┃')
        print('┃                5.退出当前用户                   ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        n = input('请输入:')
        if n == '1':
            add_student()
        elif n == '2':
            alter_student()
        elif n == '3':
            del_student()
        elif n == '4':
            query_student()
        else:
            print('成功退出当前用户')
            return
    
    
    while True:
        print('┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓')
        print('┃                                             ┃')
        print('┃             欢迎进入学生信息管理系统            ┃')
        print('┃                                             ┃')
        print('┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫')
        print('┃                  1.登录系统                  ┃')
        print('┃                  2.用户注册                  ┃')
        print('┃                  3.退出系统                  ┃')
        print('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛')
        num = input('请输入:')
        if num == '1':
            login()
        elif num == '2':
            register()
        elif num == '3':
            print('谢谢使用!')
            break
    
    

    相关文章

      网友评论

          本文标题:Python基础 - json文件和异常捕获

          本文链接:https://www.haomeiwen.com/subject/vdzfzftx.html