美文网首页
day12-json文件和异常处理

day12-json文件和异常处理

作者: xdxh | 来源:发表于2018-10-15 19:56 被阅读0次

一、文件操作

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

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

with open(文件路径 ,打开方式,encoding=编码方式) as 文件对象:

文件操作相关的代码

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

代码

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

测试结果

1.PNG

1.二进制文件的读和写

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

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

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

代码

with open('files/ship.bmp','rb') as f2:
    content = f2.read()
    print(type(content),content)

with open('./files/new.jpg','wb') as f3:
    f3.write(content)

测试结果

2.1.PNG 2.2.PNG

二、json文件(特别重要)

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

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

1.json格式

a.一个json对应一条数据。

b.json中的数据必须是json对应的数据类型。
数字类型(number) --> 所有的数字,包含整数和小数,例如:100,12.5
字符串类型(string) --> 用双引号括起来的数据,例如"abc","你好,世界!"
数组(array) --> 相当于python中的列表,例如[100,230,"abc","你好"]
字典(dictionary) --> 相当于python中的字典,例如:{"a" :100,"b":[1,2,3,4,5],"c":{}}
布尔(bool) --> 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
数字 int/float
字符串 str
数组 list
字典 dict
true/false True/False
null None

(1)loads()

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

代码

import json

content = json.loads('100')
print(content,type(content))

content = json.loads('"abc"')
print(content,type(content))

content = json.loads('[12,12.8,"name",[1,"2a"]]')
print(content,type(content))
print(type(content[3]))

content = json.loads('{"a":100,"b":true,"c":false}')
print(content,type(content))

content = json.loads('null')
print(content)

测试结果

1.PNG

(2)load()

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

代码

import json

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

测试结果

2.PNG
python json
int/float 数字
str 字符串
list 数组
dict 字典
True/False true/false
None null

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

(3)dumps()

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

代码

import json

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

str1 = json.dumps([1,2,'abc'])
print(str1)

str1 = json.dumps((100,200,'abc'))
print(str1)

测试结果

3.PNG

(4)dump()

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

代码

import json

with open('./files/test.json','w')as f:
    json.dump({'a':100,'b':200,'c':True},f)

测试结果

4.PNG

三、文件的使用

1.数据本地化的过程

1.使用数据的时候从本地文件中去取数据。
2.修改完数据后要使用新的数据去更新本地文件中的内容。


2.学生管理系统

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

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

代码

import json

# 保存所有的学生
with open('./files/students.json','r') as f:
    all_student = json.load(f)

def add_student():
    """
    添加学生
    """
    while True:
        name = input('请输入学生的姓名:')
        age = input('请输入学生的年龄:')
        tel = input('请输入学生的电话:')
        # 创建学生对应的字典
        student = {'name':name,'age':age,'tel':tel}
        #将学生添加到容器中
        all_student.append(student)
        # 将新的数据更新到本地文件中
        with open('./files/students.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:
            return

def show_student():
    """
    显示学生
    """
    for student in all_student:
        print(student)

while True:
    print('=======================')
    print('1.添加学生')
    print('2.显示学生信息')
    print('3.退出')
    print('=======================')
    input_value = input('请选择(1-3):')
    if input_value == '1':
        add_student()
    elif input_value == '2':
        show_student()
    else:
        print('退出成功!')
        break

测试结果

1.PNG

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

代码

import json

with open('./files/number.json','r') as f:
    num = json.load(f)
num += 1

with open('./files/number.json','w') as f:
    json.dump(num,f)

print('当前程序执行的次数:',num)

测试结果

2.PNG

四、异常捕获

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

代码

# a = 10 + 'abc'

2.异常捕获

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

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

try:

代码段1

except:

代码段2

finally:

代码段3

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

代码

try:
    value = input('请输入数字:')
    float_value = float(value)
except:
    print('出现了异常')
    print('输入有误!')

try:
    b = {'a':10}['b']
    a = [1,2,3][4]
    print('~~~~~')
except:
    print('又出现异常了')

测试结果

1.PNG

格式2:

try:

代码段1

except 异常类型:

代码段2

finally:

代码段3

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

代码

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

测试结果

2.PNG

格式3:

try:

代码段1

except (异常类型1,异常类型2,...):

代码段2

finally:

代码段3

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

代码

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

测试结果

3.PNG

格式4:

try:

代码段1

except 异常类型1:

代码段2

except 异常类型2:

代码段2

finally:

代码段3

代码

try:
    print([1, 2][3])
    print({'a':10}['b'])
except IndexError:
    print('下标越界')
except KeyError:
    print('key不存在')

测试结果

4.PNG

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

代码段

代码

try:
    f = open('./files/abc.txt')
except FileNotFoundError:
    print('文件不存在!')
finally:
    print('最后会执行的代码')

测试结果

5.PNG

3.抛出异常

raise 异常类型

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

代码

value = int(input('请输入一个偶数:'))
if value & 1:
    raise ValueError
else:
    print('恭喜,还活着!')

测试结果

6.PNG

五、作业(学生管理系统)

代码

import json

with open('./files/students.json', 'r') as f:
    students = json.load(f)

with open('./files/users.json', 'r') as f:
    users = json.load(f)


# 系统主页
def system_page():
    print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
    print('+                                                               +')
    print('                       欢迎来到学生管理系统                       ')
    print('+                           1. 登录                         +')
    print('+                           2. 注册                         +')
    print('+                                                               +')
    print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
    operate = input('请选择操作:')
    if operate == '1':
        login()
    elif operate == '2':
        register()


# 登录
def login():
    name = input('                    用户名:')
    password = input('                    密码:')
    for user in users:
        if user['name'] == name and user['password'] == password:
            main_page()
            break
        elif user['name'] == name and user['password'] != password:
            print('密码错误,请重新登录!')
            login()
            break
    else:
        print('不存在该用户!')
        system_page()


# 注册
def register():
    name = input('                    用户名:')
    password = input('                    密码:')
    for user in users:
        if user['name'] == name:
            print('该用户名已存在!')
            register()
    user = {'name': name, 'password': password}
    users.append(user)
    with open('./files/users.json', 'w') as f:
        json.dump(users, f)
        print('注册成功!')
        system_page()


# 主页面
def main_page():
    print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
    print('+                                                               +')
    print('                       欢迎来到学生管理系统                       ')
    print('+                           1. 添加学生                         +')
    print('+                           2. 查找学生                         +')
    print('+                           3. 删除学生                         +')
    print('+                           4. 修改学生信息                     +')
    print('+                           5. 退出                             +')
    print('+                                                               +')
    print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')

    operate = input('请选择操作:')
    if operate == '1':
        add_student()
    elif operate == '2':
        find_page()
    elif operate == '3':
        del_page()
    elif operate == '4':
        revise_page()
    elif operate == '5':
        quit()


# 添加页面
def add_page():
    print('\n1. 继续添加学生')
    print('2. 返回系统主页')
    print('3. 退出')
    operate = input('请输入操作:')
    if operate == '1':
        add_student()
    elif operate == '2':
        main_page()
    elif operate == '3':
        quit()


# 查找页面
def find_page():
    print('1. 查找全部学生')
    print('2. 按姓名查找学生')
    print('3. 按学号查找学生')
    print('4. 返回系统主页')
    operate = input('请输入操作:')
    if operate == '1':
        find_all_student()
    elif operate == '2':
        find_name_student()
    elif operate == '3':
        find_id_student()
    elif operate == '4':
        main_page()


# 查找返回页面
def find_return_page():
    print('\n1. 返回上一层')
    print('2. 返回系统主页')
    print('3. 退出')
    operate = input('请输入操作:')
    if operate == '1':
        find_page()
    elif operate == '2':
        main_page()
    elif operate == '3':
        quit()


# 删除页面
def del_page():
    print('1. 按姓名删除学生')
    print('2. 按学号删除学生')
    print('3. 返回系统主页')
    operate = input('请输入操作:')
    if operate == '1':
        del_name_student()
    elif operate == '2':
        del_id_student()
    elif operate == '3':
        main_page()


# 删除返回页面
def del_return_page():
    print('\n1. 返回上一层')
    print('2. 返回系统主页')
    print('3. 退出')
    operate = input('请输入操作:')
    if operate == '1':
        del_page()
    elif operate == '2':
        main_page()
    elif operate == '3':
        quit()


# 修改页面
def revise_page():
    print('1. 按姓名修改学生信息')
    print('2. 按学号修改学生信息')
    print('3. 返回系统主页')
    operate = input('请输入操作:')
    if operate == '1':
        revise_name_student()
    elif operate == '2':
        revise_id_student()
    elif operate == '3':
        main_page()


# 修改返回页面
def revise_return_page():
    print('\n1. 返回上一层')
    print('2. 返回系统主页')
    print('3. 退出')
    operate = input('请输入操作:')
    if operate == '1':
        revise_page()
    elif operate == '2':
        main_page()
    elif operate == '3':
        quit()


# 自动生成学号
def produce_student_id():
    with open('./files/student_id.json', 'r') as f:
        x = json.load(f)
    for num in range(x, 1000):
        student_id = 'python' + str(num).zfill(3)
        with open('./files/student_id.json', 'w') as f:
            json.dump(num+1, f)
        yield student_id


produce_student_id = produce_student_id()


# 添加学生信息
def add_student():
    student_id = next(produce_student_id)
    name = input('请输入姓名:')
    age = input('请输入年龄:')
    tel = input('请输入电话:')
    student = {'name': name, 'age': age, 'tel': tel, 'student_id': student_id}
    students.append(student)
    with open('./files/students.json', 'w') as f:
        json.dump(students, f)
    print('添加成功!')
    add_page()


# 查找全部学生
def find_all_student():
    for student in students:
        print('姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:', student['student_id'])
    find_return_page()


# 按姓名查找学生
def find_name_student():
    str1 = input('请输入姓名:')
    flag = True
    for student in students:
        if student['name'] == str1:
            flag = False
            print('姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:', student['student_id'])
    if flag:
        print('不存在该学生!')
    find_return_page()


# 按学号查找学生
def find_id_student():
    str1 = input('请输入学号:')
    for student in students:
        if student['student_id'] == str1:
            print('姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:', student['student_id'])
            break
    else:
        print('不存在该学生!')
    find_return_page()


# 按姓名删除学生
def del_name_student():
    str1 = input('请输入姓名:')
    count = 0
    del_list = []
    for student in students:
        if student['name'] == str1:
            count += 1
    if count == 0:
        print('不存在该学生!')
    else:
        if count > 1:
            for student in students:
                if student['name'] == str1:
                    print(count - 1, '.   姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:',student['student_id'])
                    del_list.append(student)
                    count += 1
            num = int(input('请输入要删除的学生:'))
            index = num - 1
            students.remove(del_list[index])
            with open('./files/students.json', 'w') as f:
                json.dump(students, f)
            print('删除成功!')
        else:
            for student in students:
                if student['name'] == str1:
                    students.remove(student)
                    with open('./files/students.json', 'w') as f:
                        json.dump(students, f)
                    print('删除成功!')
                    break
    del_return_page()


# 按学号删除学生
def del_id_student():
    str1 = input('请输入学号:')
    for student in students:
        if student['student_id'] == str1:
            students.remove(student)
            with open('./files/students.json', 'w') as f:
                json.dump(students, f)
            print('删除成功!')
            break
    else:
        print('不存在该学生!')
    del_return_page()


# 按姓名修改学生信息
def revise_name_student():
    str1 = input('请输入姓名:')
    count = 0
    revise_list = []
    for student in students:
        if student['name'] == str1:
            count += 1
    if count == 0:
        print('不存在该学生!')
    else:
        if count > 1:
            for student in students:
                if student['name'] == str1:
                    print(count - 1, '.   姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'],
                          '   学号:', student['student_id'])
                    revise_list.append(student)
                    count += 1
            num = int(input('请输入要修改的学生:'))
            name = input('修改姓名:')
            age = int(input('修改年龄:'))
            tel = int(input('修改电话:'))
            index = num - 1
            student_id = revise_list[index]['student_id']
            for student in students:
                if student['student_id'] == student_id:
                    student['name'] = name
                    student['age'] = age
                    student['tel'] = tel
                    with open('./files/students.json', 'w') as f:
                        json.dump(students, f)
                    print('修改成功!')
                    break
        else:
            for student in students:
                if student['name'] == str1:
                    print('姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:', student['student_id'])
            name = input('修改姓名:')
            age = int(input('修改年龄:'))
            tel = int(input('修改电话:'))
            for student in students:
                if student['name'] == str1:
                    student['name'] = name
                    student['age'] = age
                    student['tel'] = tel
                    with open('./files/students.json', 'w') as f:
                        json.dump(students, f)
                    print('修改成功!')
                    break
    revise_return_page()


# 按学号修改学生信息
def revise_id_student():
    str1 = input('请输入学号:')
    for student in students:
        if student['student_id'] == str1:
            print('姓名:', student['name'], '   年龄:', student['age'], '   电话:', student['tel'], '   学号:',student['student_id'])
            name = input('修改姓名:')
            age = int(input('修改年龄:'))
            tel = int(input('修改电话:'))
            student['name'] = name
            student['age'] = age
            student['tel'] = tel
            with open('./files/students.json', 'w') as f:
                json.dump(students, f)
            print('修改成功!')
            break
    else:
        print('不存在该学生!')
    revise_return_page()


system_page()

测试结果

1.PNG

相关文章

  • day12-json文件和异常处理

    一、文件操作 补充:打开文件的时候如果是以读的方式打开,如果文件不存在会报:FileNotFoundError。打...

  • Day12-json文件和异常处理

    一、文件操作 补充:打开文件的时候是以读的方式打开,如果文件不存在会报:FileNotFoundError 打开文...

  • day12-json文件和异常处理

    1.文件操作 代码示例 代码示例 2.json文件(重要) 代码示例 运行结果 代码示例 代码示例 运行结果 代码...

  • 文件和异常处理

    文件 在Python之中读写一个文件我们使用它的内置函数open来进行操作。 写读写文件如下: 读文件时需要注意的...

  • 同步或异步异常处理

    同步或异步异常处理 同步读取异常处理 异步读取文件异常处理

  • Python 文件处理

    Python 读文件处理 1. readline() with 处理开闭文件&文件异常处理 readline()内...

  • C++异常

    异常处理 头文件中定义了异常类exception和bad_exception,异常类exce...

  • day12-json和异常捕获

    02-json数据 1.什么是json数据: json是一种数据格式,满足json格式的数据就是json数据。文件...

  • day12-json和异常捕获

    1.json数据 1.什么是json数据json是一种数据格式,满足json数据格式就是json数据(json文件...

  • day12-json和异常捕获

    1. Json数据 1.1.什么是json数据 json是一种数据格式,满足json格式的数据就是json数据。文...

网友评论

      本文标题:day12-json文件和异常处理

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