Python的那些事第十二篇:从入门到“不撞南墙不回头”Python 文件操作与异常处理

Python 文件操作与异常处理:从入门到“不撞南墙不回头”


目录

Python 文件操作与异常处理:从入门到“不撞南墙不回头”

一、引言

二、Python 文件操作

三、Python 异常处理

四、综合实例:学生成绩管理系统

五、总结与展望


一、引言

1.1 文件操作与异常处理的重要性

在编程的世界里,文件操作和异常处理就像是两个超级英雄,一个负责管理数据的“藏宝库”,另一个则是程序的“护盾”。文件操作就像是在管理一个装满宝藏的仓库,负责把数据存进去,再拿出来用。比如,电商平台的订单数据,要是没有文件操作,那可真是“无处安放的青春”!而异常处理呢,就是程序的“金钟罩”,一旦程序出错,它就能及时出手,避免程序“一失足成千古恨”,用户体验也能大大提升。

1.2 Python 在文件与异常处理方面的优势

Python 在文件操作和异常处理上,简直就是“超级英雄”的升级版!文件操作方面,open() 函数就像是一个万能钥匙,搭配上各种内置方法(比如 read()write() 等)和上下文管理器 with 语句,文件的读写和管理变得轻松又便捷,简直是“手到擒来”。异常处理方面,Python 提供了各种强大的异常类,还有灵活的 try-excepttry-finally 等语法,不仅能捕获各种运行时错误,还能自定义异常,满足复杂业务需求,简直就是“十八般武艺样样精通”!


二、Python 文件操作

2.1 打开文件

open() 函数是 Python 中打开文件的“秘密武器”,它的语法是这样的:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file:文件路径,可以是相对路径(就像“近在咫尺”)或绝对路径(就像“远在天边”)。

  • mode:文件打开模式,常见的有:

    • r:只读模式,就像“只看不摸”。

    • w:写入模式,会清空文件内容,就像“推倒重建”。

    • a:追加模式,从文件末尾添加内容,就像“添砖加瓦”。

    • r+、w+、a+:分别对应读写模式,就像“又吃又拿”。

    • b:二进制模式,常与 rbwb 等结合使用,适合处理“非人类可读”的文件。

  • encoding:指定文件编码,比如 utf-8,就像给文件“穿上外衣”,防止乱码。

2.2 读取文件

Python 提供了多种方法读取文件内容,每种方法都有自己的“绝活”:

  • read():一次性读取文件全部内容,返回字符串。适用于小文件,但要注意内存占用,不然可能会“撑爆内存”。

    with open('example.txt', 'r', encoding='utf-8') as file:
        content = file.read()
  • readline():逐行读取文件,每次返回一行,适合处理大文件,就像“蚂蚁搬家”。

    with open('example.txt', 'r', encoding='utf-8') as file:
        while True:
            line = file.readline()
            if not line:
                break
            print(line)
  • readlines():将文件所有行读取到一个列表中,方便统一操作,但内存占用较大,就像“一次性打包带走”。

    with open('example.txt', 'r', encoding='utf-8') as file:
        lines = file.readlines()
        for line in lines:
            print(line)

2.3 写入文件

写入文件也有两种常用方法:

  • write():将字符串写入文件,需手动添加换行符 \n,不然内容会“挤成一团”。

    with open('example.txt', 'w', encoding='utf-8') as file:
        file.write('Hello, Python!\n')
  • writelines():批量写入字符串序列,适合写入多行内容,就像“批发处理”。

    lines = ['Line 1\n', 'Line 2\n']
    with open('example.txt', 'w', encoding='utf-8') as file:
        file.writelines(lines)

2.4 关闭文件

关闭文件很重要,不然文件资源会被“霸占”,导致其他程序无法使用。

  • close():显式关闭文件,释放资源。

    file = open('example.txt', 'w', encoding='utf-8')
    file.write('Hello, World!')
    file.close()
  • with 语句:自动管理文件的打开和关闭,推荐使用,就像“贴心的小管家”。

    with open('example.txt', 'w', encoding='utf-8') as file:
        file.write('Hello, Python!')

三、Python 异常处理

3.1 异常的概念

异常就像是程序运行时的“小插曲”,会打断正常执行流程。常见的异常类型包括:

  • ValueError:值错误,比如把非数字字符串转换为数字,就像“把方块硬塞进圆孔”。

  • TypeError:类型错误,比如对不同类型对象进行非法操作,就像“让猫去拉车”。

  • FileNotFoundError:文件未找到错误,就像“找钥匙找得满头包”。

  • ZeroDivisionError:除数为零错误,就像“分苹果给零个人”。

  • IndexError、KeyError:索引或键错误,就像“找错抽屉”。

  • NameError:未定义变量错误,就像“叫了一个不存在的人”。

  • ImportError:导入模块错误,就像“找错图书馆”。

3.2 异常处理语法

Python 提供了多种异常处理语法,每种都有自己的“用武之地”:

  • try-except:捕获并处理异常,就像“提前准备好救生圈”。

    try:
        num = int('abc')
    except ValueError:
        print("输入的字符串无法转换为整数")
  • try-finally:无论是否发生异常,finally 块中的代码都会执行,常用于资源释放,就像“无论怎样都要打扫战场”。

    try:
        file = open('example.txt', 'r')
    finally:
        file.close()
  • else 子句:在 try 块中未发生异常时执行,就像“一切顺利,庆祝一下”。

    try:
        num = int('123')
    except ValueError:
        print("输入的字符串无法转换为整数")
    else:
        print("转换成功,数值为:", num)

3.3 自定义异常

通过继承 Exception 类创建自定义异常,就像“打造自己的武器”,用于处理特定业务逻辑错误。

class OutOfStockError(Exception):
    def __init__(self, book_name):
        super().__init__(f"{book_name} 库存不足,无法借阅")
        self.book_name = book_name

# 抛出自定义异常
def borrow_book(book_name):
    if book_name not in book_stock or book_stock[book_name] <= 0:
        raise OutOfStockError(book_name)
    else:
        book_stock[book_name] -= 1
        print(f"{book_name} 借阅成功,剩余库存: {book_stock[book_name]}")

四、综合实例:学生成绩管理系统

4.1 实例需求与背景介绍

开发一个学生成绩管理系统,实现录入学生成绩、查询成绩、统计成绩等功能,并通过文件操作存储数据,同时对可能出现的异常进行处理,确保系统的稳定性和数据的安全性。这个系统就像是一个“成绩管家”,帮助老师和学生管理成绩,再也不用担心成绩丢失或者出错啦!

4.2 代码实现

以下是实现代码:

# 录入学生成绩
def input_student_grades():
    try:
        with open('students_grades.txt', 'a', encoding='utf-8') as file:
            name = input("请输入学生姓名: ")
            student_id = int(input("请输入学生学号: "))
            course = input("请输入课程名称: ")
            grade = float(input("请输入学生成绩: "))
            student_info = f"{name},{student_id},{course},{grade}\n"
            file.write(student_info)
            print("学生成绩录入成功!")
    except ValueError:
        print("输入的学号或成绩格式不正确,请输入有效的数字。")
    except Exception as e:
        print(f"录入成绩时出现错误: {e}")

# 查询学生成绩
def query_student_grades():
    try:
        with open('students_grades.txt', 'r', encoding='utf-8') as file:
            query_type = input("请选择查询方式 (1: 学号, 2: 姓名): ")
            if query_type == '1':
                student_id = int(input("请输入要查询的学号: "))
                found = False
                for line in file:
                    parts = line.strip().split(',')
                    if int(parts[1]) == student_id:
                        print(f"姓名: {parts[0]}, 学号: {parts[1]}, 课程: {parts[2]}, 成绩: {parts[3]}")
                        found = True
                        break
                if not found:
                    print("未找到该学号的学生成绩。")
            elif query_type == '2':
                name = input("请输入要查询的姓名: ")
                found = False
                for line in file:
                    parts = line.strip().split(',')
                    if parts[0] == name:
                        print(f"姓名: {parts[0]}, 学号: {parts[1]}, 课程: {parts[2]}, 成绩: {parts[3]}")
                        found = True
                        break
                if not found:
                    print("未找到该姓名的学生成绩。")
            else:
                print("无效的查询方式,请输入1或2。")
    except FileNotFoundError:
        print("成绩文件不存在,请先录入成绩。")
    except ValueError:
        print("输入的学号格式不正确,请输入有效的数字。")
    except Exception as e:
        print(f"查询成绩时出现错误: {e}")

# 统计学生成绩
def calculate_student_grades():
    try:
        with open('students_grades.txt', 'r', encoding='utf-8') as file:
            student_scores = {}
            for line in file:
                parts = line.strip().split(',')
                name = parts[0]
                grade = float(parts[3])
                if name not in student_scores:
                    student_scores[name] = []
                student_scores[name].append(grade)
            for student, scores in student_scores.items():
                total_score = sum(scores)
                average_score = total_score / len(scores)
                print(f"{student} 的总分: {total_score}, 平均分: {average_score}")
                with open('students_summary.txt', 'a', encoding='utf-8') as summary_file:
                    summary_info = f"{student},{total_score},{average_score}\n"
                    summary_file.write(summary_info)
    except FileNotFoundError:
        print("成绩文件不存在,请先录入成绩。")
    except ValueError:
        print("成绩数据格式不正确,无法计算。")
    except Exception as e:
        print(f"统计成绩时出现错误: {e}")

# 主程序入口
if __name__ == "__main__":
    while True:
        print("1. 录入学生成绩")
        print("2. 查询学生成绩")
        print("3. 统计学生成绩")
        print("4. 退出系统")
        choice = int(input("请选择操作 (1-4): "))
        if choice == 1:
            input_student_grades()
        elif choice == 2:
            query_student_grades()
        elif choice == 3:
            calculate_student_grades()
        elif choice == 4:
            print("退出系统,再见!")
            break
        else:
            print("无效的选择,请重新输入。")

4.3 实例总结与反思

这个系统通过文件操作实现了学生成绩的存储和读取,并利用异常处理机制确保了程序的稳定性和用户体验。不过,它也还有一些“小毛病”,比如数据验证不够严格,文件安全性有待提高,异常处理还可以更精细一些。比如,可以增加数据校验,防止“乱七八糟”的数据进来;可以做文件备份,防止数据“飞了”;还可以记录日志,方便“事后诸葛亮”。总之,这个系统还有很多提升空间,就像“升级打怪”一样,一步步变得更强!


五、总结与展望

5.1 知识回顾与总结

本文详细介绍了 Python 的文件操作和异常处理知识,包括文件的打开、读取、写入和关闭,以及异常的捕获、处理和自定义。通过学生成绩管理系统实例,展示了这些知识在实际项目中的应用。文件操作和异常处理是编写高质量 Python 程序的基础,掌握它们能够有效提升程序的健壮性和效率。总之,这些知识就像是“编程的武功秘籍”,学会了就能在编程江湖中“横着走”!

5.2 未来学习方向与建议

  • 文件操作:学习高效处理大文件的方法,比如内存映射文件操作,就像“给文件装上火箭”;了解跨平台文件操作的差异,避免“南橘北枳”。

  • 异常处理:深入研究多线程和多进程环境下的异常处理机制,因为那里的异常就像“顽皮的小精灵”,到处乱跑;优化异常处理代码,提升性能,让程序“跑得飞快”。

  • 学习资源:阅读官方文档、开源代码,就像“站在巨人的肩膀上”;参与技术社区,和大家一起“头脑风暴”,积累实践经验。

  • 项目实践:参与实际项目开发,把理论知识应用到实际问题中,就像“在实战中磨炼剑法”,不断提升编程能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文解读:《基于TinyML毫米波雷达的座舱检测、定位与分类》

摘要 本文提出了一种实时的座舱检测、定位和分类解决方案&#xff0c;采用毫米波&#xff08;mmWave&#xff09;雷达系统芯片&#xff08;SoC&#xff09;&#xff0c;CapterahCAL60S344-AE&#xff0c;支持微型机器学习&#xff08;TinyML&#xff09;。提出了波束距离-多普勒…

【B站保姆级视频教程:Jetson配置YOLOv11环境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11环境&#xff08;7&#xff09;Ultralytics YOLOv11环境配置 文章目录 1. 下载YOLOv11 github项目2. 安装ultralytics包3. 验证ultralytics安装3.1 下载yolo11n.pt权重文件3.2 推理 1. 下载YOLOv11 github项目 创建一个目录&#xff0c;用于存放YOLOv11的项目…

代码讲解系列-CV(二)——卷积神经网络

文章目录 一、系列大纲二、卷积神经网络&#xff08;图像分类为例&#xff09;2.1 pytorch简介训练框架张量自动微分动态计算图更深入学习 2.2 数据输入和增强Dataset—— torch.utils.data.DatasetDataLoader——torch.utils.data.Dataloader数据增强 2.3 CNN设计与训练nn.Mod…

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…

堆的基本概念

1.1 堆的基本概念 虚拟机所在目录 E:\ctf\pwn-self 进入虚拟机的pwndocker环境 holyeyesubuntu:~$ pwd /home/holyeyes holyeyesubuntu:~$ sudo ./1run.sh IDA分析 int __fastcall main(int argc, const char **argv, const char **envp) { void *v4; // [rsp20h] [rbp-1…

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…

合宙air001使用命令行烧写固件

起因&#xff1a; 做了个小板子给同事使用&#xff0c;但同事没有air001的arduino编译烧录环境&#xff0c;安装的话&#xff0c;对于没有接触过arduino的人有些复杂&#xff0c;所以想着能不能直接烧录编译好的固件&#xff1b; 经过&#xff1a; 在网上搜索相关教程&#…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备&#xff08;摄像机、麦克风&#xff09;媒体流实现Web端预览。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 demo-server解耦 原始代码解析 http服务器端 import argparse import asyncio import json…

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

随着开源 LLM 的发展&#xff0c;越来越多的模型变得专业化&#xff0c;“代码”LLM 变得非常流行。这些 LLM 旨在比其 “常识” 对应物更小&#xff0c;但旨在超越更大的通用模型的编码性能。 这些模型以极低的成本提供大型模型的功能&#xff0c;进一步使本地 LLM 空间民主化…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

HTB:EscapeTwo[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…

多无人机--强化学习

这个是我对于我的大创项目的构思&#xff0c;随着时间逐渐更新 项目概要 我们的项目平台来自挑战杯揭绑挂帅的无人机对抗项目&#xff0c;但是在由于时间原因&#xff0c;并未考虑强化学习&#xff0c;所以现在通过大创项目来弥补遗憾 我们项目分为三部分&#xff0c;分为虚…

龙芯+FreeRTOS+LVGL实战笔记(新)——16数码管驱动

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以前往本人在B站的视频合集(图1所示)观看所有演示视频,合集首个视频链接为: https://www.bilibili.…

Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后&#xff0c;采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…

[Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建回归神经网络。这篇文章将介绍如何利用PyTorch构建神经网络实现分类预测,其是使用基础模块构建。前面我们的Python人工智能主要以TensorFlow和Keras为主,而现在最主流的深度学习框…

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…