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

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


目录

[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 中打开文件的"秘密武器",它的语法是这样的:

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():一次性读取文件全部内容,返回字符串。适用于小文件,但要注意内存占用,不然可能会"撑爆内存"。

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

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

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

2.3 写入文件

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

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

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

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

2.4 关闭文件

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

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

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

    python 复制代码
    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:捕获并处理异常,就像"提前准备好救生圈"。

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

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

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

3.3 自定义异常

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

python 复制代码
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 代码实现

以下是实现代码:

python 复制代码
# 录入学生成绩
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 未来学习方向与建议

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

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

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

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

相关推荐
生命不息战斗不止(王子晗)13 分钟前
JVM 四虚拟机栈
开发语言·jvm
NoneCoder22 分钟前
JavaScript系列(54)--性能优化技术详解
开发语言·javascript·性能优化
小林熬夜学编程1 小时前
【MySQL】第一弹---MySQL 在 Centos 7环境安装
linux·开发语言·数据库·mysql·算法
xiaocang6688881 小时前
如何使用Python调用大语言模型的API接口?
开发语言·python·语言模型
没有名字的鬼1 小时前
C_位运算符及其在单片机寄存器的操作
c语言·开发语言
魂兮-龙游1 小时前
C语言:将四个八位无符号数据拼接成32位的float数据
c语言·开发语言·算法·数据分析
依瑾雅1 小时前
Lua语言的云计算
开发语言·后端·golang
m0_748248231 小时前
Java进阶14 TCP&日志&枚举
java·开发语言·tcp/ip
几道之旅2 小时前
windows下玩转vllm:vllm简介
人工智能·python
我喜欢就喜欢2 小时前
自定义多功能输入对话框:基于 Qt 打造灵活交互界面
开发语言·qt·交互