【python实操】python小程序之文件操作的输出指定格式数据以及异常捕获

news2024/11/25 2:24:00

引言

python小程序之文件操作的输出指定格式数据以及异常捕获

文章目录

  • 引言
  • 一、文件操作之输出指定格式JSON
    • 1.1 题目
    • 1.2 代码
    • 1.3 代码解释
      • 1.3.1 总结
  • 二、异常
    • 2.1 概念
      • 2.1.1 基本语法
        • 2.1.1.1 `try...except`
        • 2.1.1.2 `try...except...else`
        • 2.1.1.3 `try...except...finally`
        • 2.1.1.4 `try...except...else...finally`
      • 2.1.2 捕获多个异常
      • 2.1.3 捕获所有异常
      • 2.1.4 抛出异常
      • 2.1.5 自定义异常
      • 2.1.6 总结
    • 2.2 代码
      • 2.2.1 try...except
      • 2.2.2 try、except、else、finally完全版
      • 2.2.3 捕获多个指定类型的异常
    • 2.3 代码解释
      • 2.3.1 try、except、else、finally完全版
      • 2.3.2 捕获多个指定类型的异常
  • 三、思考
    • 3.1 输出指定格式JSON
    • 3.2 异常
    • 3.3 异常的传递
      • 3.3.1 概念
      • 3.3.2 代码实例
      • 3.3.3 总结

一、文件操作之输出指定格式JSON

1.1 题目

某网站的测试数据如下 data.json, 需求,提取 json ⽂件中的⽤户名,密码和预期结果, 组成如下格式: [(), (), ()] (⾃动化参数化需要的数据格式)

1.2 代码

import json


def read_data():
    data = []
    with open('data.json', 'r', encoding='utf-8') as f:
        info = json.load(f)
        # print(info)
        for i in info:
            data.append((i.get('username'), i.get('password'), i.get('expect')))
    return data


print(read_data())

输出结果:
在这里插入图片描述

1.3 代码解释

这段代码定义了一个函数 read_data,该函数从一个名为 data.json 的 JSON 文件中读取数据,并将每个条目的特定字段(username, password, expect)提取出来,存储在一个列表中。最后,它打印出这个列表

  1. 导入 json 模块

    import json
    

    导入 Python 的 json 模块,用于处理 JSON 数据

  2. 定义 read_data 函数

    def read_data():
    

    定义一个名为 read_data 的函数,该函数没有参数

  3. 初始化空列表 data

    data = []
    

    创建一个空列表 data,用于存储从 JSON 文件中提取的数据

  4. 打开并读取 JSON 文件

    with open('data.json', 'r', encoding='utf-8') as f:
        info = json.load(f)
    
    • 使用 open 函数以只读模式 ('r') 和指定编码 (encoding='utf-8') 打开 data.json 文件
    • 使用 json.load(f) 方法将文件内容解析为 Python 对象(通常是列表或字典),并将结果存储在变量 info
  5. 遍历 info 并提取特定字段

    for i in info:
        data.append((i.get('username'), i.get('password'), i.get('expect')))
    
    • 遍历 info 列表中的每个元素 i
    • 使用 i.get('username')i.get('password')i.get('expect') 分别获取每个元素中的 usernamepasswordexpect 字段的值
    • 将这三个值作为一个元组添加到 data 列表中
  6. 返回 data 列表

    return data
    

    返回包含所有提取数据的 data 列表

  7. 调用 read_data 函数并打印结果

    print(read_data())
    

    调用 read_data 函数,并打印其返回的结果

1.3.1 总结

通过这种方式,可以轻松地从 JSON 文件中提取特定字段的值,并将它们存储在一个列表中

二、异常

2.1 概念

在python 中,异常处理是一种重要的编程机制,它允许优雅地处理程序运行时可能出现的错误。Python 提供了 tryexceptelsefinally 语句来实现异常处理

2.1.1 基本语法

2.1.1.1 try...except

这是最基本的异常处理结构。try 块中包含可能引发异常的代码,而 except 块则用来捕获并处理这些异常

try:
    # 可能会抛出异常的代码
    x = 1 / 0
except ZeroDivisionError as e:
    # 捕获并处理特定异常
    print(f"除零错误: {e}")
2.1.1.2 try...except...else

如果 try 块中的代码没有引发任何异常,则执行 else 块中的代码

try:
    x = 1 / 1  # 不会引发异常
except ZeroDivisionError as e:
    print(f"除零错误: {e}")
else:
    print("没有发生异常")
2.1.1.3 try...except...finally

无论是否发生异常,finally 块中的代码都会被执行。这通常用于释放资源,如关闭文件或网络连接

try:
    f = open("file.txt", "r")
    content = f.read()
except FileNotFoundError as e:
    print(f"文件未找到: {e}")
finally:
    f.close()
    print("文件已关闭")
2.1.1.4 try...except...else...finally

这是一个完整的异常处理结构,结合了上述所有部分

try:
    f = open("file.txt", "r")
    content = f.read()
except FileNotFoundError as e:
    print(f"文件未找到: {e}")
else:
    print(content)
finally:
    f.close()
    print("文件已关闭")

2.1.2 捕获多个异常

可以在一个 except 块中捕获多种类型的异常,或者使用多个 except 块分别处理不同类型的异常

try:
    x = int(input("请输入一个整数: "))
    y = 10 / x
except ValueError as e:
    print(f"输入无效: {e}")
except ZeroDivisionError as e:
    print(f"不能除以零: {e}")

2.1.3 捕获所有异常

如果想要捕获所有类型的异常,可以使用不带任何参数的 except 语句。但这样做通常是不推荐的,因为它可能会隐藏潜在的问题

try:
    x = 1 / 0
except Exception as e:
    print(f"发生了未知错误: {e}")

2.1.4 抛出异常

可以使用 raise 语句手动抛出异常。这通常用于表示某些条件不满足时的逻辑错误

def check_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    elif age > 120:
        raise ValueError("年龄太大,不合理")
    else:
        print(f"年龄是: {age}")

try:
    check_age(-5)
except ValueError as e:
    print(e)

2.1.5 自定义异常

可以通过继承内置的 Exception 类来创建自定义异常类

class MyCustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

try:
    raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:
    print(f"捕获到自定义异常: {e}")

2.1.6 总结

通过合理使用这些异常处理机制,你可以编写更加健壮和用户友好的 Python 程序

2.2 代码

2.2.1 try…except

try:
    num = input('请输⼊数字:')
    num = int(num)
    print(num)
except:
    print('请输⼊正确的数字')
print('后续其他的代码,可以继续执⾏')

输出结果:
在这里插入图片描述

2.2.2 try、except、else、finally完全版

try:
    num = input('请输⼊数字:')
    num = int(num)
    print(num)
    a = 10 / num
    print(f'a: {a}')
except Exception as e:
    print(f"错误信息为: {e}")
else:
    print('没有发生异常我会执行')
finally:
    print('不管有没有发生异常,我都会执行')

输出结果(未发生异常):
在这里插入图片描述

输出结果(发生异常):
在这里插入图片描述

2.2.3 捕获多个指定类型的异常

try:
    num = input('请输⼊数字:')
    num = int(num)
    print(num)
    a = 10 / num
    print(f'a: {a}')
except ValueError:
    print('发生了异常, 请输入正确的数字...')
except ZeroDivisionError:
    print('除数不能为 0')

输出结果(num格式不对,例如不是数字):
在这里插入图片描述

输出结果(num为0):
在这里插入图片描述

2.3 代码解释

2.3.1 try、except、else、finally完全版

这段代码是一个简单的 Python 程序,用于演示如何处理可能出现的异常

  1. try: - 开始一个 try 块,在这个块中尝试执行可能抛出异常的代码
  2. num = input('请输⼊数字:') - 请求用户输入一个数字,并将该输入存储在变量 num 中。这里得到的是字符串类型的值
  3. num = int(num) - 尝试将用户输入的字符串转换成整数。如果用户没有输入有效的整数,则这行代码会引发 ValueError 异常
  4. print(num) - 如果上面的转换成功了,打印转换后的整数 num
  5. a = 10 / num - 计算 10 除以 num 的结果,并将结果存入变量 a。如果 num 是 0,那么这里将会产生 ZeroDivisionError 异常,因为除数不能为零
  6. print(f'a: {a}') - 打印变量 a 的值

接下来是异常处理部分:

  1. except Exception as e: - 如果在 try 块中的任何代码引发了异常,那么程序流程将跳转到 except 块。Exception 是所有内置非系统退出异常的基类,所以它能捕捉大多数常见的异常。as e 允许我们将异常对象赋给变量 e,这样我们可以在 except 块中使用它
  2. print(f"错误信息为: {e}") - 使用 f-string 格式化输出异常信息。{e} 会被异常对象 e 的字符串表示所替换

然后是正常执行流程的部分:

  1. else: - 如果 try 块没有抛出任何异常,那么 else 块将会被执行
  2. print('没有发生异常我会执行') - 打印一条消息,表明 try 块内的代码执行顺利,没有遇到任何异常

最后是不论是否发生异常都会执行的部分:

  1. finally: - finally 块总是会被执行,无论 try 块中的代码是否抛出异常或者是否执行了 except 或者 else 块
  2. print('不管有没有发生异常,我都会执行') - 打印一条消息,表明 finally 块被触发

综上所述,这段代码的主要目的是让用户输入一个数字,然后计算 10 除以这个数字的结果。同时,它也通过 try-except-else-finally 结构来处理和报告潜在的运行时错误,如输入无效或除数为零的情况,并且确保某些清理工作(在这个例子中只是打印一条消息)始终会被执行

2.3.2 捕获多个指定类型的异常

这段python 代码使用了 tryexcept 结构来处理用户输入数字时可能出现的两种特定类型的异常:ValueErrorZeroDivisionError

  1. try: - 开始一个 try 块,尝试执行可能抛出异常的代码
  2. num = input('请输⼊数字:') - 向用户请求输入,并将输入存储在变量 num 中。这里得到的是字符串类型的数据
  3. num = int(num) - 将用户输入的字符串尝试转换成整数。如果输入不是有效的整数(例如,用户输入了一个字母或符号),这行会引发 ValueError 异常
  4. print(num) - 如果转换成功,则打印转换后的整数 num
  5. a = 10 / num - 计算 10 除以 num 的结果,并将结果存入变量 a。如果 num 是 0,那么这行会引发 ZeroDivisionError 异常,因为不能除以零
  6. print(f'a: {a}') - 打印变量 a 的值

接下来是针对不同异常的处理部分:

  1. except ValueError: - 如果在 try 块中发生了 ValueError 异常(即第3步中的转换失败),程序流程跳转到这个 except 块

  2. print('发生了异常, 请输入正确的数字...') - 输出一条消息给用户,提示他们输入了一个无效的数字

  3. except ZeroDivisionError: - 如果在 try 块中发生了 ZeroDivisionError 异常(即第5步中的除数为0),程序流程跳转到这个 except 块

  4. print('除数不能为 0') - 输出一条消息给用户,告诉他们不能用0作为除数

这段代码通过分别捕捉 ValueErrorZeroDivisionError 来提供更具体的错误信息,从而提高了用户体验。如果用户输入非数字字符,他们会收到一条关于输入正确数字的消息;如果用户试图用0做除数,他们会被告知这是不允许的。这样,用户可以清楚地知道他们的输入哪里出了问题,并且有机会纠正它

三、思考

3.1 输出指定格式JSON

  • 导入 json 模块:用于处理 JSON 数据
  • 定义 read_data 函数:该函数从 data.json 文件中读取数据
  • 初始化空列表 data:用于存储提取的数据
  • 打开并读取 JSON 文件:使用 openjson.load 将 JSON 文件内容加载为 Python 对象
  • 遍历 info 并提取特定字段:将 usernamepasswordexpect 字段的值作为元组添加到 data 列表
  • 返回 data 列表:返回包含所有提取数据的列表
  • 调用 read_data 函数并打印结果:调用 read_data 函数,并打印其返回的结果

3.2 异常

  • try:包含可能引发异常的代码
  • except:捕获并处理特定异常
  • else:如果没有异常发生,则执行的代码
  • finally:无论是否有异常发生,都会执行的代码
  • raise:手动抛出异常
  • 自定义异常:通过继承 Exception 类来创建自定义异常类

3.3 异常的传递

3.3.1 概念

异常传递是指在一个函数中抛出的异常没有被捕获,而是被传递给调用该函数的地方。如果调用者也没有处理这个异常,那么异常将继续向上层调用栈传递,直到被某个 except 块捕获或导致程序终止。在python中,异常传递是自动进行的。如果不使用 try...except 语句来捕获异常,那么异常就会从当前作用域向上传递到上一级调用者

3.3.2 代码实例

def divide(a, b):
    return a / b  # 如果 b 是 0,这里会抛出 ZeroDivisionError

def call_divide(x, y):
    result = divide(x, y)  # 如果 divide 抛出异常,这里不会处理它
    print(f"Result: {result}")

try:
    call_divide(10, 0)  # 调用 call_divide 并传递可能引发异常的参数
except ZeroDivisionError as e:
    print(f"Caught an exception: {e}")

在这个例子中,divide 函数尝试执行除法操作。如果 b(也就是 y)是 0,divide 将抛出一个 ZeroDivisionError。由于 divide 函数内部没有 try...except 结构来捕获这个异常,所以异常会被传递给 call_divide 函数。同样地,call_divide 也没有捕获异常,因此异常继续向上抛出。最后,异常到达了最外层的 try...except 结构,在那里它被 except ZeroDivisionError 捕获,并打印出错误信息

3.3.3 总结

这种机制允许将错误处理逻辑集中在程序的适当位置,而不是分散在各个函数中。它也使得可以设计出更加模块化和可维护的代码。当异常发生时,可以通过检查调用栈来追踪异常是从哪里开始发生的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量化选股:原理与实战指南(二)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化选股:原理与实战指南(二)🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 一、价值类因子简介 …

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

基于springboot Vue3的两种图形验证码工具——vue3-puzzle-vcode纯前端防人机图形滑动验证码和kaptcha图片文字验证码

一.vue3-puzzle-vcode Vue 纯前端的拼图人机验证、右滑拼图验证 官网&#xff1a; vue3-puzzle-vcode - npm (npmjs.com)https://www.npmjs.com/package/vue3-puzzle-vcode 1.1基本使用步骤 安装 npm install vue-puzzle-vcode --save 简单例子 点击开始验证按钮弹出验证弹…

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十一&#xff09;–rpm管理和计划任务 一、rpm管理&#xff08;重点&#xff09; 1、rpm管理 作用&#xff1a; rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…

【机器学习】集成学习|Boosting|随机森林|Adaboost|GBDT梯度提升树|XGBoost 极限梯度提升树 及案例实现

文章目录 集成学习集成学习思想概述集成学习分类Bagging 思想Boosting思想Bagging 和 Boosting 的对比 随机森林算法随机森林实现步骤随机森林算法apiAPI 代码实现 Adaboost 算法实现步骤整体过程实现 算法推导Adaboost 案例 葡萄酒数据 GBDT (梯度提升树)提升树 BDT (Boosting…

WPF 中的 StackPanel 详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软开发的一种用于创建桌面客户端应用程序的用户界面框架。WPF 提供了一套丰富的控件和布局能力&#xff0c;使得开发者可以轻松构建出功能强大、视觉优美的用户界面。在 WPF 的布局系统中&#xff0c;StackPane…

Git上传命令汇总

进入企业&#xff0c;每日需要上传执行用例记录到gitlab平台上&#xff0c;本文记录了常用git上传命令&#xff0c; 并用github演示。 1、本地建立分支&#xff0c;克隆远程仓库 在gitlab中&#xff0c;每个人需要创建自己的分支&#xff0c;一般以自己的名字命名&#xff0c;…

新品牌Sesame Street《芝麻街》商标版权双维权,尚未TRO

案件基本情况起诉时间&#xff1a;2024-10-8案件号&#xff1a;24-cv-09713品牌&#xff1a;Sesame Street原告&#xff1a;Sesame Workshop原告律所&#xff1a;TME起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Sesame Street《芝麻街》是美国公共广播协会&#xff08;PBS&…

5个IO控制20个LED灯的方案详解

工程师们经常为了节省一两个IO口想各种方案想到抠脑壳&#xff0c;今天给大家整点活儿&#xff0c;介绍一种超级节省IO口的LED灯控制方案。 5个IO口控制20个LED灯&#xff0c;而且可以对每个LED灯实现单独控制。电路结构如下&#xff1a; 注意一下这种电路网络&#xff0c;其…

ctf.bugku-baby lfi

题目来源&#xff1a;baby lfi - Bugku CTF平台 访问页面&#xff0c; 翻译解析&#xff1a;百度翻译-您的超级翻译伙伴&#xff08;文本、文档翻译&#xff09; (baidu.com) LFI Warmups - 本地文件包含&#xff08;Local File Inclusion&#xff0c;简称LFI&#xff09; H…

【最新华为OD机试E卷-支持在线评测】喊7的次数重排(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

Linux基础-进程的超详细讲解(1)_进程的概念与属性

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux基础-进程的超详细讲解(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 进…

day-65 鸡蛋掉落-两枚鸡蛋

思路 动态规划&#xff1a;dp[i]表示i楼f确切的值的最小操作次数&#xff0c;对于上一次选择的楼层共有i-1种可能&#xff08;上一次从1楼,2楼…扔下&#xff09;&#xff0c;所以需要在i-1中可能中去最小值 解题过程 对于每一种可能&#xff0c;如dp[10]上一次从5楼扔下&…

ES-入门聚合查询

url 请求地址 http://192.168.1.108:9200/shopping/_search {"aggs": { //聚合操作"price_group":{ //名称,随意起名"terms":{ //分组"field": "price" //分组字段}}} } 查询出来的结果是 查询结果中价格的平均值 {&q…

KubeSphere部署mysql

演示示例使用的是3.4.1&#xff0c;各版本有名字差异 功能是一样的 由于mysql需要做数据持久化所以需要挂载数据 1.创建mysql基础配置 项目中-配置-配置字典 mysql-conf添加键值对 [client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] …

数据库设计与开发—初识SQLite与DbGate

一、SQLite与DbGate简介 &#xff08;一&#xff09;SQLite[1][3] SQLite 是一个部署最广泛、用 C 语言编写的数据库引擎&#xff0c;属于嵌入式数据库&#xff0c;其作为库被软件开发人员嵌入到应用程序中。 SQLite 的设计允许在不安装数据库管理系统或不需要数据库管理员的情…

QT QML 练习4

效果&#xff1a;鼠标按下Tab建可以选选择标签或者方块之间的切换 这段代码使用了 QtQuick 框架&#xff0c;创建了一个包含两个 Text 元素和两个嵌套 Rectangle 的用户界面。以下是对代码中涉及的主要知识点和实现细节的介绍&#xff1a; 知识点及代码细节介绍 导入 QtQuic…

SpringAOP学习文档

目录 一、概念二、示例代码三、切点1、execution2、within3、this4、target5、args6、annotation7、within8、target9、args10、组合切点表达式11、在Before注解中使用自定义的切入点表达式&#xff0c;以及切入点方法12、获取指定类型的真实对象 四、通知1、Around注解的通知方…

AI赋能,精准防控:AI智能分析网关V4人员徘徊算法的技术优势与应用场景

随着科技的飞速发展&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;从公共安全到商业管理&#xff0c;再到交通监控等。AI智能分析网关V4作为新一代的视频分析设备&#xff0c;以其强大的智能分析能力和多样化的应用场景&#xff0c;成为市场关注的焦点。本文…

pytorch与卷积神经网络实战笔记

课程视频链接 CNN卷积神经网络算法原理 全神经网络的整体结构 输入层&#xff08;x1, x2, x3…&#xff09;->隐藏层&#xff08;全连接&#xff09;->输出层&#xff0c;整体就类似于一个函数&#xff0c;输入x&#xff0c;经过函数module(x)得到输出y的过程&#xf…