Python程序设计项目化教程 课件 项目5 文件操作与异常处理_第1页
Python程序设计项目化教程 课件 项目5 文件操作与异常处理_第2页
Python程序设计项目化教程 课件 项目5 文件操作与异常处理_第3页
Python程序设计项目化教程 课件 项目5 文件操作与异常处理_第4页
Python程序设计项目化教程 课件 项目5 文件操作与异常处理_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Python程序设计项目化教程》文件操作与异常处理主讲人:xxx项目5项目背景在实际应用中,程序通常需要将数据持久化存储到文件中,以便下次运行时能够继续使用。文件操作是实现数据持久化存储的关键环节,Python语言提供了丰富的文件操作功能,支持文本文件、CSV(Comma-SeparatedValues,逗号分隔值)文件、JSON(JavaScriptObjectNotation,JavaScript对象表示法)文件格式等多种数据存储方式。此外,程序在运行过程中难免会遇到各种异常情况,如文件不存在、权限不足、数据格式错误等。合理的异常处理机制不仅能增强程序的健壮性,还能提升用户体验。Python语言内置了异常处理机制,通过处理,能够在程序出现异常时提供友好的错误提示。本项目将通过4个递进式任务帮助读者掌握文件读写、JSON数据处理、异常处理及数据备份等实用技能,最终实现一个具备数据持久化存储功能的学生信息管理系统。学习目标:01掌握文本文件的读写操作,理解文件打开模式的区别;熟悉JSON格式的数据序列化与反序列化方法。理解异常处理机制,能使用try-except结构处理常见错误。能够实现数据的自动备份与恢复功能。培养程序健壮性和数据安全意识。02030405思政引领数据安全意识:通过文件存储与备份任务,引导读者理解数据持久化存储的重要性,养成定期备份的习惯,防范数据丢失风险;规范编码习惯:通过异常处理任务,培养读者编写健壮代码的意识,理解“防御式编程”在实际项目中的应用价值;技术标准意识:通过JSON格式的使用,了解标准化数据格式在系统交互和数据共享中的优势,增强对行业规范的认知。目录

使用文本文件存储学生信息任务5.1

处理CSV文件和JSON文件任务5.2添加异常处理任务5.3学生信息管理系统V3.0(文件持久化版)项目演练任务5.1

使用文本文件存储学生信息任务描述本任务要求使用文本文件存储学生信息,每行保存一条学生记录,实现数据“保存到文件”和“从文件加载”两个基本功能,掌握文本文件的基本读写操作。任务准备1.文件概述文件是存储在外部介质(如计算机硬盘等)上的数据集合。文本文档、图片、程序、音频、视频等都是文件。文件标识用于找到计算机中唯一确定的文件,由文件路径、文件名主干和文件扩展名3部分组成。通过文件路径可以唯一确定其在存储介质中的位置。路径可以分为相对路径和绝对路径:相对路径是相对于当前工作目录或特定目录的路径;绝对路径是从文件系统的根目录开始,完整描述文件所在位置的路径。文件名主干是文件的核心标识,用于区分不同文件的名称部分。文件扩展名通常以点分隔,紧跟在文件名主干的后面,用于指示文件的类型。例如,.txt表示文本文件,.json表示JSON文件,.jpg表示图片文件等。任务准备1.文件概述根据数据的组织形式,文件可以分为文本文件和二进制文件两大类。文本文件以字符编码的形式存储数据,如ASCII码、UTF-8编码等,其内容可以被文本编辑器直接读取和编辑,如常见的.txt文件、.py源代码文件等。二进制文件二进制文件以字节为单位存储数据,其内容是计算机可以直接识别的二进制信息,如图片文件(.jpg、.png)、音频文件(.mp3)、可执行程序(.exe)等,通常需要特定的软件才能解析和处理。任务准备2.文件的基本操作在Python语言中,操作文件需要遵循一个固定的流程:打开文件→读写文件→关闭文件。这就像在现实生活中,要看书需要先打开书,然后阅读,最后合上书。1)文件的打开当用户需要对文件进行读取或写入操作时,需要先将文件打开,建立与文件的连接。在Python语言中,使用内置的open()函数可以打开一个文件并返回一个文件对象。语法格式如下:file为必需项,用于指定文件名或文件路径;mode为可选项,用于指定文件的打开模式,默认值为r(只读模式);buffering为可选项,用于设置缓冲;encoding为可选项,用于指定文件的编码方式,默认值为None,表示使用系统默认的编码方式,常见的有UTF-8、GBK等。open(file,mode,buffering,encoding)任务准备2.文件的基本操作常用的文件打开模式模式含义说明r只读模式默认模式。以只读的方式打开文件,文件必须存在,否则报错w只写模式以只写的方式打开文件。如果文件存在,则清空文件中的内容;如果文件不存在,则创建新文件。有数据丢失风险a追加模式以只写的方式打开文件。如果文件存在,则在文件的末尾追加内容;如果文件不存在,则创建新文件b二进制模式以二进制方式打开文件,用于处理图片、视频等非文本文件。该模式可以与其他模式结合使用,如rb、wb等+读写模式与其他模式结合,表示可同时读写,如r+(读写)、w+(写读)任务准备2.文件的基本操作文件打开模式分为文本模式和二进制模式。文本模式为默认模式,用于处理字符数据,如.txt文件、.py文件等。在文本模式下,Python会自动进行编码解码,encoding参数生效二进制模式需与'b'组合使用,如'rb'、'wb',用于处理如图片、音频文件等字节数据。在二进制模式下,数据以原始字节读写,encoding参数被忽略。示例代码如下:f=open('E:/example.txt','r',encoding='utf-8')

#以只读模式打开一个文本文件,显式指定UTF-8编码img_f=open('E:/photo.jpg','rb')

#以二进制只读模式打开一个图片log_f=open('app.log','a',encoding='utf-8') #以追加模式打开一个文件,用于写入日志任务准备2.文件的基本操作注意,在Python文件路径中,推荐使用正斜杠(/),在Windows系统中如果使用反斜杠(\),则需要进行转义(\\)。另外,当使用只读模式打开文件时,该文件必须已经存在,否则Python会抛出FileNotFoundError异常任务准备2.文件的基本操作2)文件的读取操作使用open()函数打开文件只是准备工作,只是建立了程序与文件之间的连接通道,并没有实际读取或修改文件中的内容。Python语言提供了多种读写方法用于对文件中的内容进行操作。常用的读取方法有read()、readline()和readlines(),常用的写入方法有write()和writelines()。read()方法用于从文件对象中读取指定字节数或字符数的数据,如果未指定值或值为负,则读取所有字符,返回一个字符串。语法格式如下:参数size用于指定从文件中读取数据的字节数或字符数,可以省略,表示读取文件中的所有内容,如果传入size值,则会读取前size长度的字符或字节。文件对象.read([size])任务准备2.文件的基本操作2)文件的读取操作例如,在E盘中创建一个test.txt文件,该文件中的内容如图5-3所示。使用read()方法读取test.txt文件,示例代码如下:f=open('E:/test.txt','r',encoding='utf-8')print(f.read())#输出:千里之行,始于足下print(f.read(4))#输出前4个字符:千里之行任务准备2.文件的基本操作2)文件的读取操作readline()方法用于从指定的文件中读取一行数据,包括该行数据末尾的换行符\n,返回一个字符串,多次调用可以逐行读取文件。例如,在E盘中创建一个test01.txt文件,该文件中的内容如图5-4所示。使用readline()方法读取test01.txt文件,示例代码如下:f=open('E:/test01.txt','r',encoding='utf-8')print(f.readline())#输出:千里之行,始于足下print(f.readline())#输出:持之以恒,方能致远print(f.readline())#输出:代码之路,亦复如是任务准备2.文件的基本操作2)文件的读取操作readlines()方法用于一次性读取文件中的所有行,返回一个包含每行数据的列表。示例代码如下:f=open('E:/test01.txt','r',encoding='utf-8')print(f.readlines())#输出:['千里之行,始于足下\n','持之以恒,方能致远\n','代码之路,亦复如是\n','文件操作,基础之始']任务准备2.文件的基本操作3)文件的写入方法在Python语言中,要将内容写入文件,需要使用适当的打开模式。如果打开文件时使用只读模式,就不能进行写入操作,需要使用只写模式或追加模式打开文件。只写模式将覆写原有的文件,追加模式将在已有文件的末尾添加内容。如果打开的文件不存在,则只写模式和追加模式都会创建一个新的空文件。在写入操作方面,write()方法用于将字符串写入文件,并返回写入的字符数,包括换行符\n。如果需要换行,则需手动添加换行符\n。例如,如果使用只写模式打开test02.txt,因为没有test02.txt文件,则Python解释器会先创建该文件,然后在该文件中写入文字内容“学海无涯,勤为舟\n代码如山,练为径”。示例代码如下:打开test02.txt文件,即可看到写入的内容.string="学海无涯,勤为舟\n代码如山,练为径"f=open('E:/test02.txt','w',encoding='utf-8')print(f.write(string)) #输出:17任务准备2.文件的基本操作3)文件的写入方法writelines()方法用于将一个可迭代对象(如列表)中的所有元素写入文件,但不会自动添加换行符\n,需要在元素中自行包含。例如,将[‘HelloWorld,序章之始\n’,’算法逻辑,编程之魂’]写入test02.txt文件,示例代码如下:打开test02.txt文件,即可看到写入的内容,如图5-6所示。string="学海无涯,勤为舟\n代码如山,练为径"f=open('E:/test02.txt','w',encoding='utf-8')print(f.write(string)) #输出:17string01=['\nHelloWorld,序章之始\n','算法逻辑,编程之魂\n']f.writelines(string01)任务准备2.文件的基本操作4)文件的关闭完成读写操作后,务必调用文件对象的close()方法关闭文件,以释放系统资源,防止数据丢失或文件损坏。例如,在操作完test02.txt文件后,使用close()方法关闭该文件。示例代码如下:当打开与关闭之间的操作较多时,很容易遗漏文件的关闭操作,为此Python语言引入with语句来自动管理文件资源,在with语句执行完毕后,无论是否发生异常,都会自动关闭文件。with语句的语法格式如下:在缩进的代码块中即可对文件对象进行读写操作。例如,使用with语句读取文件中的内容,示例代码如下:这样在读取操作完成后,文件会被自动关闭,无须再显式调用

close()方法,极大地提高了代码的安全性和简洁性。f.close()withopen(file,mode,encoding)asfile_object:

代码块withopen('E:/test.txt','r',encoding='utf-8')asf:

print(f.read())任务准备2.文件的基本操作5)文件指针文件指针是文件对象内部的一个指示器,用于标记当前读写操作在文件中的位置。当打开文件后,文件指针的初始位置会根据打开模式的不同而有所差异:在只读模式下,文件指针默认位于文件的开头;在只写模式下,文件指针将定位到文件的开头并清空内容;在追加模式下,文件指针将移至文件的末尾。如果需要在文件的指定位置进行读写操作,则可以通过文件对象的tell()方法来获取文件指针当前的位置。seek()方法用于手动调整文件指针的位置,语法格式如下:其中,offset用于指定偏移量(字节数);whence用于指定偏移的参考位置,0表示文件的开头,1表示当前位置,2表示文件的末尾。文件对象.seek(offset,whence)任务准备2.文件的基本操作5)文件指针示例代码如下:如果将上述示例代码中的f.seek(15,0)修改为f.seek(15,1),则会报错,如图5-7所示。如果要相对当前位置或文件的末尾进行操作,则需要使用二进制模式打开文件,并且不能指定编码方式。withopen('E:/test.txt','r',encoding='utf-8')asf:print(f.tell()) #输出:0,文件当前的读写位置print(f.read(5)) #输出:“千里之行,”,读取了5个字符,而不是5个字节print(f.tell()) #输出:15,因为在UTF-8编码中,一个中文字符通常占3个字节print(f.seek(15,0)) #相对文件的开头移动15个字节print(f.read())任务准备2.文件的基本操作6)路径操作在实际开发中,文件路径的处理是文件操作的重要环节。Python

语言提供了

os

模块和pathlib模块来简化路径相关的操作,在使用这两个模块之前,要使用import语句导入对应的模块。os模块提供了基于字符串的传统路径处理方式,提供了文件路径操作函数,如表5-2所示。函数说明os.getcwd()获取当前工作目录,即当前Python脚本所在的目录os.chdir()改变当前脚本的工作目录os.remove()删除指定的文件os._exit()终止Python程序os.path.abspath(path)返回路径(path)的绝对路径os.path.split(path)将路径(path)分割为形如(目录,文件名)的二元组并返回os.mkdir()在当前目录下创建目录os.rmdir(path)删除指定的目录,该目录必须是空的任务实施--任务分析本任务旨在实现一个基于文本文件的学生信息管理系统,核心目标是通过文件操作完成学生数据的持久化存储与读取。在数据组织方面,系统采用结构化的方式管理学生信息。每条学生记录包含4个基本字段:学号、姓名、年龄和专业。这些字段在存储时使用逗号作为分隔符,形成标准化的数据格式,确保每条记录都能以清晰统一的形式保存。系统功能主要围绕以下3个核心模块展开。(1)数据保存模块:负责将内存中的学生信息集合写入文本文件。该模块会遍历所有的学生记录,将每个字段按照预定格式拼接成文本行,通过文件写入操作实现数据的持久化存储。(2)数据加载模块:实现从文本文件到程序内存的数据恢复功能。该模块会逐行读取文件中的内容,解析每行文本,根据分隔符拆解出各个字段,重新构建学生记录对象。(3)数据显示模块:提供用户界面支持,以清晰易读的格式展示所有的学生信息。该模块会将加载到内存中的学生记录按照预定排版格式输出,方便用户查看和验证数据内容。任务实现1.将数据保存到文本文件中将学生信息列表中的每条记录都转换为字符串,并按行写入文件。示例代码如下:defsave_to_txt(students,filename="students.txt"):withopen(filename,"w",encoding="utf-8")asf:forstuinstudents:#将学生信息转换为字符串(如“1001,张三,18,男,计算机1班”)line=f"{stu['id']},{stu['name']},{stu['age']},{stu['major']}\n"f.write(line)print(f"数据已保存到{filename}!")文件中任务实现2.从文本文件中加载数据读取文件中的每行内容,将其解析为字典并添加到列表中。示例代码如下:defload_from_txt(filename="students.txt"):students=[]withopen(filename,"r",encoding="utf-8")asf:forlineinf.readlines():data=line.strip().split(",")#按照逗号分割字符串iflen(data)==4:students.append({"id":data[0],"name":data[1],"age":int(data[2]),"major":data[3]})print(f"从{filename}文件中加载数据成功!")returnstudents任务实现3.显示所有的学生信息提供清晰的数据展示界面,以表格形式输出所有的学生信息,增强数据的可读性。示例代码如下:

defdisplay_students(students):#检查是否有学生信息ifnotstudents:print("没有学生信息")return#打印表头print("\n学生信息列表:")print("-"*50)#遍历并显示每个学生信息,enumerate用于生成序号fori,studentinenumerate(students,1):print(f"{i}.学号:{student['id']},姓名:{student['name']},年龄:{student['age']},专业:{student['major']}")任务实现4.准备测试数据创建标准化的示例数据集,用于验证学生信息管理系统中各项功能的正确性。示例代码如下:

#创建学生信息列表示例sample_students=[{'id':'001','name':'张三','age':'20','major':'计算机科学'},{'id':'002','name':'李四','age':'19','major':'软件工程'},{'id':'003','name':'王五','age':'21','major':'人工智能'}]任务实现5.主程序构建完整的主程序流程,验证数据保存、加载和显示功能的协同工作效果。示例代码如下:if__name__=="__main__":filename="students.txt"#保存数据save_to_txt(sample_students,filename)#加载数据loaded_students=load_from_txt(filename)#显示数据display_students(loaded_students)任务总结本任务主要介绍了文件的概念及基本操作。通过文本文件的基本读写操作,实现了学生信息的持久化存储。文本文件适合存储简单的行式数据,但复杂结构需手动解析,效率较低。任务测试一、选择题1.如果要打开一个已有文件并在该文件的末尾添加数据,则应该使用(

)模式打开文件?A.r B.w C.a D.w+2.关于Python文件操作,以下说法中正确的是(

)。A.在使用open()函数打开文件后,必须使用close()方法关闭文件,with语句无法自动关闭文件B.当使用'r'模式打开不存在的文件时会自动创建该文件C.当使用write()方法向文件中写入内容时会自动添加换行符,无须手动添加D.使用w模式打开已存在的文件会清空该文件中原有的内容,存在数据丢失风险3.在执行以下代码后,content.txt文件中的内容是(

)。A.HelloWorldPythonB.Hello\nWorld\nPythonC.HelloWorld\nPython D.Hello\nWorldPython4.关于文件指针操作,以下描述中错误的是(

)。A.tell()方法可以获取文件指针的当前位置B.seek()方法可以移动文件指针的位置C.当使用r模式打开文件时,文件指针的初始位置在文件的开头D.当使用文本模式打开文件时,seek()方法的whence参数的值可以使用1(当前位置)或2(文件的末尾)withopen('content.txt','w',encoding='utf-8')asf:f.write('Hello')f.writelines(['World','Python'])任务测试二、判断题1.使用“withopen()asf:”语句打开文件,在代码块执行完毕后会自动关闭文件,无须手动调用close()方法。

)2.当使用a模式打开文件时,如果该文件不存在,则会报错,不会自动创建新文件。(

)。

任务5.2处理CSV文件和JSON文件任务描述本任务要求使用CSV格式和JSON格式存储学生信息。相较于传统的文本文件,CSV格式通过逗号分隔字段,能更规范地存储表格型数据,适合使用Excel等工具直接打开并进行编辑;而JSON格式则以键值对的形式组织数据,支持保留字典、列表等原生数据结构,避免手动解析,更适合表示复杂的对象信息,在Web开发和数据交换中应用广泛。任务准备1.CSV文件概述CSV是一种常用的文本文件格式,使用逗号分隔字段,每行表示一条记录。CSV文件具有以下特点:(1)结构简单,易于读写。(2)兼容性好,能被Excel等多种软件直接打开。(3)适合存储表格型数据。CSV文件的扩展名通常是.csv,既可以通过Windows系统中的记事本或微软公司的OfficeExcel打开,也可以通过其他文本编辑工具打开。Python标准库中内置了csv模块,该模块专门用于处理CSV文件,能够简化文件的读写操作,避免因手动处理分隔符、引号转义等问题引发的错误。任务准备2.CSV文件的读取操作要使用csv模块从CSV文件中读取数据,需要创建一个reader对象。reader对象是可迭代对象,可以通过for循环遍历CSV文件中的每行数据。例如,在E盘中创建一个test.csv文件,该文件中的内容如图5-8所示。要使用csv模块读取CSV文件,需要先导入csv模块,然后使用open()函数以文本模式打开该CSV文件,并将其传递给csv.reader()函数,此时会返回一个reader对象,最后通过for循环遍历reader对象,每次迭代会获取一行数据。每行是一个值的列表,每个值对应CSV文件中的一个单元格。示例代码如下:importcsvwithopen('E:/test.csv')asf:

r=csv.reader(f)

foriinr:

print(i)任务准备2.CSV文件的读取操作对于包含标题行的CSV文件,通常使用DictReader对象,而不使用reader对象。reader对象通过使用列表对CSV文件中的行进行读写;DictReader对象则将每行数据映射为字典,字典中的键对应CSV文件中的表头(首行字段名),值对应该行中各个字段的内容。示例代码如下:importcsvwithopen('E:/test.csv')asf:r=csv.DictReader(f)foriinr:print(i)任务准备3.CSV文件的写入操作writer对象可以将数据写入CSV文件。要创建一个writer对象,需要使用csv.writer()函数。首先使用只写模式打开一个文件,然后将打开的文件对象传递给csv.writer()函数来创建一个writer对象。writer对象的writerow()方法和writerows()方法可以将列表内容写入CSV文件。writerow()方法用于写入单行数据,它接收一个可迭代对象作为参数,将其中的元素按顺序写入CSV文件中的一行,各个元素之间自动使用逗号隔开。例如,向CSV文件中写入一条学生记录,示例代码如下:importcsvwithopen('E:/student.csv','w',newline='',encoding='utf-8')asf:w=csv.writer(f)w.writerow(['学号','姓名','年龄','专业'])#写入表头w.writerow(['001','张三',20,'计算机科学'])#写入一条学生数据任务准备3.CSV文件的写入操作writerows()方法用于批量写入多行数据,它接收一个包含多个可迭代对象的列表作为参数,每个可迭代对象代表一行数据。例如,要同时写入多条学生记录,可以将这些记录整理成一个元素为列表的列表,然后将其传递给writerows()方法。示例代码如下:此操作会将students列表中的每个子列表作为一行数据追加到CSV文件中,如图5-10所示。importcsvstudents=[['002','李四',19,'软件工程'],['003','王五',21,'人工智能'],['004','赵六',22,'数据科学']]withopen('E:/student.csv','a',newline='',encoding='utf-8')asf:w=csv.writer(f)w.writerows(students) #批量写入多行数据任务准备3.CSV文件的写入操作对于包含字典结构的数据,csv模块还提供了DictWriter对象,可以通过字段名将字典中的键值对对应写入CSV文件中的相应列,使用起来更加直观。语法格式如下:f是文件对象,fieldnames是要写入的字典中的键。在创建DictWriter对象后,需要使用writeheader()方法写入表头,再使用writerow()方法或writerows()方法写入数据行。示例代码如下:csv.DictWriter(f,fieldnames)importcsv

fieldnames=['学号','姓名','年龄','专业']student_dict={'学号':'005','姓名':'孙七','年龄':20,'专业':'网络工程'}

withopen('students.csv','a',newline='',encoding='utf-8')asf:

w=csv.DictWriter(f,fieldnames=fieldnames)

#检查文件是否为空,为空才写入表头

iff.tell()==0:

w.writeheader()

w.writerow(student_dict)任务准备4.JSON格式简介JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,不仅易于人阅读和编写,还易于机器解析和生成。JSON文件和普通文本文件之间的区别,如表5-3所示。特性普通文本文件JSON文件数据结构需手动解析直接支持字典、列表等结构可读性人工可读,但依赖分隔符和格式有缩进格式,可读性好数据类型仅支持字符串支持数字、布尔、数组等应用场景简单数据存储数据交换、配置文件任务准备4.JSON格式简介JSON格式的数据存储在键值对中,数据的字段使用英文逗号隔开,一个大括号保存一个JSON对象,一个中括号保存一个数组。JSON数据示例如下:{

"姓名":"张三",

"年龄":20,

"专业":"计算机科学",

"是否在校":true,

"课程":["Python编程","数据结构","数据库"]}任务准备5.JSON文件的基本操作在Python中,使用json模块操作JSON文件主要包括序列化和反序列化两个过程。序列化是指将Python对象(如字典、列表)转换为JSON格式的字符串并写入文件,反序列化是指从JSON文件中读取字符串并将其转换为Python对象。在对JSON文件进行写入时,需先导入json模块,然后使用open()函数以只写模式打开文件,最后调用json.dump()函数或json.dumps()函数。其中,json.dump()函数可以直接将Python对象写入文件对象,语法格式如下:obj是要序列化的Python对象;fp是文件对象;ensure_ascii用于控制非ASCII字符的编码方式;indent用于设置缩进的空格的数量,以增强JSON文件的可读性。json.dump(obj,fp,ensure_ascii,indent)任务准备5.JSON文件的基本操作例如,将学生信息字典写入JSON文件,示例代码如下:在运行上述示例代码后,students.json文件中会生成格式化的JSON数据,包含该学生的各项信息。importjsonstudent={"id":"001","name":"张三","age":20,"major":"计算机科学"}withopen("E:/students.json","w",encoding="utf-8")asf:json.dump(student,f,ensure_ascii=False,indent=4)任务准备5.JSON文件的基本操作在读取JSON文件时,使用json.load()函数或json.loads()函数。json.load()函数能直接从文件对象中读取JSON数据并将其转换为Python对象。例如,读取上述students.json文件,示例代码如下:如果要处理JSON字符串,则使用json.dumps()函数(用于将Python对象转换为JSON格式的字符串)和json.loads()函数(用于将JSON格式的字符串转换为Python对象)。例如,将列表转换为JSON格式的字符串并输出,示例代码如下:importjsonwithopen("E:/students.json","r",encoding="utf-8")asf:data=json.load(f)print(data["name"]) #输出:张三importjsonstudents_list=[{"id":"002","name":"李四"},{"id":"003","name":"王五"}]json_str=json.dumps(students_list,ensure_ascii=False,indent=2)print(json_str)任务实施--任务分析本任务需要实现一个具有数据持久化存储功能的学生信息管理系统,通过CSV和JSON两种文件格式实现学生信息的存储与读取,确保数据的长期保存和跨平台交换。系统功能主要围绕以下两个核心模块展开:(1)支持将学生信息保存为CSV格式,便于使用Excel等工具打开查看,并能够从CSV文件中读取数据并还原为学生对象列表。(2)支持将学生信息保存为JSON格式,保持数据结构完整性,并能够从JSON文件中读取数据并将其直接转换为Python对象。任务实现1.实现CSV文件写入功能实现将学生信息列表转换为CSV格式并写入文件,包含表头定义和数据行写入。示例代码如下:defsave_to_csv(students,filename="E:/students.csv"):withopen(filename,"w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["学号","姓名","年龄","专业"])#写入表头#逐行写入学生信息forstudentinstudents:writer.writerow([student['id'],student['name'],student['age'],student['major']])print(f"成功保存{len(students)}条记录到CSV文件{filename}中")returnTrue任务实现2.实现CSV文件读取功能实现从CSV文件中读取数据并解析为学生信息列表,包含表头处理和格式验证。示例代码如下:defload_from_csv(filename="students.csv"):students=[] withopen(filename,"r",encoding="utf-8")asf:reader=csv.reader(f)headers=next(reader,None)print(f"CSV文件表头:{headers}")forrow_num,rowinenumerate(reader,1):#读取数据行iflen(row)==4:student={"id":row[0],"name":row[1],"age":row[2],"major":row[3]}students.append(student)else:print(f"警告:第{row_num}行数据的格式错误,已跳过")print(f"从CSV文件中加载了{len(students)}条记录")returnstudents任务实现3.保存数据到JSON文件使用json.dump()函数将学生信息列表直接保存为JSON格式,保持数据结构完整性,示例代码如下:

4.从JSON文件中加载数据使用json.load()函数从JSON文件中读取数据并将其直接转换为

Python

对象。示例代码如下:importjsondefsave_to_json(students,filename="students.json"):withopen(filename,"w",encoding="utf-8")asf:json.dump(students,f,ensure_ascii=False,indent=4)print("数据已保存为JSON格式!")defload_from_json(filename="students.json"):withopen(filename,"r",encoding="utf-8")asf:students=json.load(f)print("JSON数据加载成功!")returnstudents任务实现5.显示学生信息提供格式化的表格输出,清晰展示学生信息,包含数据统计和分页标识。示例代码如下:defdisplay_students_advanced(students,data_source="数据"):ifnotstudents:print("没有学生信息可显示")returnprint(f"\n{data_source}-学生信息列表")print("="*65)print(f"{'序号':<4}{'学号':<8}{'姓名':<8}{'年龄':<6}{'专业':<15}")print("-"*65)fori,studentinenumerate(students,1):print(f"{i:<4}{student['id']:<8}{student['name']:<8}{student['age']:<6}{student['major']:<15}")print("="*65)print(f"总计:{len(students)}名学生")任务总结在Python数据处理过程中,CSV格式通过csv模块实现表格型数据的规范存储,使用reader对象、writer对象进行行列读写;JSON格式则通过json模块实现层次化数据交换,能够保留字典、列表结构,无须手动解析数据结构,支持复杂嵌套,并且可读性更强,使用json.dump()函数或json.dumps()函数、json.load()函数或json.loads()函数分别进行序列化和反序列化,适用于需要保留数据类型的场景,如配置文件和API数据传输。任务测试一、选择题1.关于CSV文件处理,以下说法中正确的是(

)。A.CSV文件只能存储数字型数据,不能存储文本B.csv.reader()函数返回的数据是字典类型C.使用csv.DictWriter对象可以按字典中的键值对写入CSV文件D.CSV文件中的分隔符只能是逗号,不能更改2.关于JSON数据处理,以下说法中错误的是(

)。A.json.loads()函数用于将JSON格式的字符串转换为Python对象B.json.dumps()函数用于将Python对象转换为JSON字符串C.JSON格式支持Python语言中的所有数据类型,包括datetime对象D.JSON格式中的null对应Python语言中的None3.以下代码的功能是(

)。A.将字典写入CSV文件B.将字典转换为JSON格式的字符串,支持中文字符C.从JSON字符串中解析出字典对象D.将字典保存到数据库importjson

data={'name':'张三','age':20,'scores':[85,92,78]}json_str=json.dumps(data,ensure_ascii=False)任务测试二、判断题1.CSV文件可以使用Excel直接打开和编辑。

)2.JSON格式的数据必须使用双引号表示字符串,单引号无效。

)三、编程题编写一个函数,该函数用于该读取包含学生信息的CSV文件,返回学生的人数。任务5.3添加异常处理任务描述本任务要求为文件操作添加异常处理,包括当文件不存在时自动创建该文件、当权限不足时提示用户、当数据的格式错误时跳过异常记录等,提升程序的健壮性。任务准备1.异常概述在程序运行过程中,可能会遇到各种不可预见的错误情况,如文件不存在、权限不足、磁盘空间不足、数据格式错误等。Python

语言提供了强大的异常处理机制,可以帮助开发人员和运维人员处理异常。当程序运行时出现异常,如果没有在程序中设置异常处理功能,则Python解释器会使用系统默认的方法处理异常,返回异常信息并终止程序。任务准备2.常见的异常类型在Python语言中,常使用异常对象来表示不同的异常。常见的异常类型如表5-4所示。异常类型含义AssertionError当关键字assert后的条件为假时,程序运行会停止并抛出该异常AttributeError当试图访问的对象属性不存在时会抛出该异常IndexError当索引超出序列范围时会抛出该异常KeyError当在字典中查找一个不存在的关键字时会抛出该异常NameError当尝试访问一个未声明的变量时时会抛出该异常TypeError当对不支持的类型进行操作或函数接收到类型错误的参数时会抛出该异常ZeroDivisionError当除法运算中的除数为0会抛出该异常任务准备2.常见的异常类型常见的文件操作异常如表5-5所示。异常类型含义FileNotFoundError当访问的文件不存在时会抛出该异常PermissionError当没有文件访问权限时会抛出该异常JSONDecodeError当JSON格式错误时会抛出该异常UnicodeDecodeError当文件的编码不匹配时会抛出该异常IsADirectoryError当尝试将目录作为文件打开时会抛出该异常任务准备3.异常捕获语句当程序出现异常时,Python默认的异常处理行为将开始工作,它通常会停止程序并输出错误提示信息。但很多时候我们希望在出现异常时程序能够处理并继续运行,不被终止。例如,服务器程序通常需要在发生内部错误时依然保持工作。如果不使用默认的异常处理行为,就需要自行捕捉并处理异常。在Python语言中,既可以通过try-except语句实现简单的异常捕获与处理,也可以将try-except语句和else子句或finally子句组合使用实现更强大的异常捕获与处理。try-except语句的语法格式如下:try:

可能出错的代码except[异常类型[as异常信息]]:

捕获异常后的处理代码任务准备3.异常捕获语句try-except语句的执行过程:首先执行try子句中的代码块,如果执行过程中没有发生异常,则跳过except子句,继续执行后续代码;如果在执行try子句时发生了异常,并且该异常的类型与except后指定的异常类型相匹配,则立即终止try子句的执行,转而执行except子句中的处理代码,处理完成后继续执行后续代码;如果发生的异常类型未被except子句捕获,则程序会终止并抛出该异常。例如,在文件读取操作中,如果文件不存在,则可能会引发FileNotFoundError异常,通过try-except语句可以捕获该异常并给出提示信息,而不是让程序直接崩溃。try: #尝试打开并读取文件withopen('test05.txt','r',encoding='utf-8')asf:content=f.read()print(f"文件内容:\n{content}")exceptFileNotFoundError: #当文件不存在时的异常处理print(f"错误:文件test05.txt不存在!")任务准备3.异常捕获语句除基本的try-except语句以外,还可以添加else子句和finally子句。else子句用于指定当try子句中没有发生异常时执行的代码块,它必须紧跟在所有except子句之后;finally子句用于定义无论是否发生异常都会执行的清理操作,如关闭文件、释放资源等,通常放置在整个异常处理结构的最后。这种多结构组合的异常处理方式,能够让程序在面对各种错误情况时更加灵活和可靠,可以有效提升代码的健壮性和用户体验。语法格式如下:try:

可能出现异常的代码块except[异常类型[as异常信息]]:

捕获异常后的处理代码else:

只有当try子句中没有抛出任何异常时,才会执行相应的代码finally:

无论是否发生异常,最终一定会执行的代码(常用于清理资源)任务准备3.异常捕获语句示例代码如下:try:num=int(input("请输入一个数字:"))result=10/numexceptValueErrorase:#捕获值错误(如输入了字母)print(f"输入错误:{e}")exceptZeroDivisionErrorase:#捕获到除零错误print(f"计算错误:{e}")else:print(f"计算结果:{result}")finally:print("程序执行完毕(无论对错都会执行)。")任务准备4.抛出异常在Python语言中,除捕获系统自动抛出的异常以外,还可以根据业务逻辑主动抛出异常。使用raise语句可以手动抛出指定类型的异常,并可以附带自定义的错误提示信息。使用raise语句抛出异常的语法格式如下:例如,在添加学生信息前验证数据的有效性,当检测到学生的年龄为负数或非数字时,可以主动抛出ValueError异常,提示“年龄必须是正整数”。示例代码如下:这样,当外部调用该函数传入无效年龄时,就会抛出异常,强制调用者处理数据合法性问题。raise异常类型(错误提示信息)ifnotisinstance(age,int)orage<=0:raiseValueError("年龄必须是正整数")任务准备4.抛出异常assert语句又称断言语句,是一种简洁的条件判断工具。使用assert语句抛出异常的语法格式如下:当条件表达式的值为False时,assert语句会自动抛出AssertionError异常,并将错误提示信息作为异常描述;当条件表达式的值为True时不进行任何操作。例如,在读取CSV文件时,如果需要确保表头包含id字段和name字段,则可以使用assert语句进行校验,示例代码如下:这种方式常用于开发和调试阶段,帮助开发人员快速定位代码中的逻辑错误,但需注意在生产环境中过度依赖assert语句可能存在风险,因为Python解释器可以通过"-O"参数忽略所有的assert语句。与raise语句显式抛出异常相比,assert语句更适用于内部自检,raise语句更适合在业务逻辑中主动抛出特定的异常,以明确告知调用者错误原因并强制其处理。assert条件表达式,错误提示信息assert"id"inheadersand"name"inheaders,"CSV文件中的表头缺少必要字段"任务准备5.自定义异常虽然Python语句中内置了许多异常类型,但是在实际开发中有时需要开发人员自定义异常类型,以满足当前程序的需要。在Python语言中,异常也是对象,可以对它进行操作。自定义异常需要创建一个继承Exception类或Exception子类的类,并且都在exceptions模块中定义。通过创建一个新的异常类,程序可以命名它们自己的异常。当遇到设定的错误时,使用raise语句抛出自定义异常。自定义异常类通常包含初始化方法,用于接收和存储与异常相关的信息,如错误代码、详细描述等,以便在捕获异常时能够获取更具体的上下文。classStudentIDError(Exception):def__init__(self,student_id):super().__init__(f"学号{student_id}已存在")self.student_id=student_idstudents={"001":"张三","002":"李四"}try:student_id=input("请输入学号:")ifstudent_idinstudents:raiseStudentIDError(student_id)students[student_id]="王五"print("添加成功")exceptStudentIDErrorase:print(f"错误:{e}")例如,在学生信息管理系统中,当添加学生信息时检测到学号已存在,可以定义一个名称为StudentIDError的自定义异常,该异常继承自Exception类,并在初始化方法中接收重复的学号作为参数。示例代码如下:任务实施--任务分析本任务旨在为文件操作添加完善的异常处理,提升程序的健壮性和用户体验。通过捕获和处理各种可能出现的异常情况,确保程序在遇到错误时能够优雅地处理而非直接崩溃。系统功能主要围绕以下3个核心模块展开:(1)文件操作异常处理。处理文件不存在异常,自动创建该文件或提供错误提示信息;处理文件权限不足异常,给出明确的解决方案提示;处理编码异常,确保中文字符正确读写。(2)数据格式异常处理。验证输入数据的合法性;处理数据转换过程中的类型错误;跳过格式错误的记录并记录日志。(3)资源管理。确保文件资源正确释放;实现异常情况下的数据回滚或恢复。任务实现1.使用with语句实现CSV文件的异常安全操作实现CSV文件的安全加载与保存功能,针对文件不存在、权限不足等常见异常提供相应的处理策略。示例代码如下:importcsvimportjsonimportosdefsafe_csv_load(filename="students.csv"):"""安全加载CSV文件"""students=[]try:withopen(filename,"r",encoding="utf-8")asf:reader=csv.reader(f)headers=next(reader,None)forrowinreader:iflen(row)==4:students.append({'id':row[0],'name':row[1],'age':row[2],'major':row[3]})exceptFileNotFoundError:print("CSV文件不存在,已自动创建新文件。")withopen(filename,"w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["学号","姓名","年龄","专业"])exceptPermissionError:print("权限不足,无法读取CSV文件。")exceptExceptionase:print(f"在读取CSV文件时发生错误:{e}")returnstudentsdefsafe_csv_save(students,filename="students.csv"):"""安全保存到CSV文件"""try:withopen(filename,"w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["学号","姓名","年龄","专业"])forstudentinstudents:writer.writerow([student['id'],student['name'],student['age'],student['major']])returnTrueexceptPermissionError:print("权限不足,无法写入CSV文件。")returnFalseexceptExceptionase:print(f"在保存CSV文件时发生错误:{e}")returnFalse任务实现2.使用with语句实现JSON文件的异常安全操作实现JSON文件的安全读写功能,专门处理JSON格式解析错误和文件访问权限异常。示例代码如下:defsafe_json_load(filename="students.json"):"""安全加载JSON文件"""students=[]try:withopen(filename,"r",encoding="utf-8")asf:students=json.load(f)exceptFileNotFoundError:print("JSON文件不存在,已自动创建新文件。")withopen(filename,"w",encoding="utf-8")asf:json.dump([],f,ensure_ascii=False,indent=4)exceptPermissionError:print("权限不足,无法读取JSON文件。")exceptjson.JSONDecodeError:print("JSON文件的格式错误,跳过加载。")exceptExceptionase:print(f"在读取JSON文件时发生错误:{e}")returnstudentsdefsafe_json_save(students,filename="students.json"):

"""安全保存到JSON文件"""

try:

withopen(filename,"w",encoding="utf-8")asf:

json.dump(students,f,ensure_ascii=False,indent=4)

returnTrue

exceptPermissionError:

print("权限不足,无法写入JSON文件。")

returnFalse

exceptExceptionase:

print(f"在保存JSON文件时发生错误:{e}")

returnFalse任务实现3.使用异常处理实现数据验证的安全操作实现用户输入的安全采集功能,对数据类型和数值范围进行严格验证,防止无效数据进入系统。示例代码如下:defsafe_input_student():"""安全输入学生信息"""try:student_id=input("学号:").strip()name=input("姓名:").strip()age=int(input("年龄:"))major=input("专业:").strip()

ifage<=0:print("年龄必须为正数。")returnNone

return{'id':student_id,'name':name,'age':age,'major':major}exceptValueError:print("年龄必须为数字。")returnNoneexceptExceptionase:print(f"在输入数据时发生错误:{e}")returnNone任务总结通过异常处理,程序能够优雅地应对各种错误场景,避免崩溃,从而提升用户体验和数据的安全性。在实际开发中,完善的异常处理是保证软件质量的关键因素,能够显著提高系统的可靠性和可维护性。任务测试一、选择题1.关于Python异常处理,以下说法中正确的是(

)。A.在try-except语句中,except子句必须指定具体的异常类型B.else子句在发生异常时执行,finally子句无论是否发生异常都会执行C.一个try子句可以对应多个except子句来处理不同类型的异常D.所有异常都必须手动处理,否则程序无法运行2.在文件操作中,以下异常与文件相关的匹配错误的是(

)。A.FileNotFoundError-文件不存在 B.PermissionError-权限不足C.KeyError-文件格式错误 D.IOError-输入输出错误3.关于异常处理的最佳实践,以下说法中错误的是(

)。A.应该尽量捕获具体的异常,而不是使用裸露的except:B.异常处理不能替代正常的条件检查C.在异常处理中应该记录足够的错误信息,以便调试D.为了程序稳定,应该捕获所有的异常并忽略它们任务测试二、判断题1.finally子句中的代码无论是否发生异常都会执行。

)2.使用exceptExceptionase可以捕获所有程序异常。

)三、编程题编写一个函数,该函数用于安全地读取文件中的内容,如果文件不存在,则返回空字符串。项目演练:学生信息管理系统V3.0(文件持久化版)项目目标在前两个版本的基础上,学生信息管理系统V3.0重点解决数据持久化存储问题。通过引入文件操作功能,实现学生信息的长期保存和跨会话使用,使系统更加实用和完整。项目分析(1)数据持久化存储:采用CSV格式存储,便于使用Excel查看和进行数据处理;采用JSON格式保持数据结构完整性。(2)数据加载恢复:启动时自动加载已有数据,并支持手动导入和导出操作。(3)异常处理:当文件不存在时自动创建该文件,当数据的格式错误时跳过异常记录,当权限不足时提示用户。项目实施1.文件操作核心函数定义CSV格式和JSON格式的文件读写功能,包含完整的异常处理机制,确保数据持久化存储的可靠性。示例代码如下:importcsvimportjson#文件路径配置CSV_FILE="students.csv"JSON_FILE="students.json"defsave_to_csv(students):"""保存数据到CSV文件中"""try:withopen(CSV_FILE,"w",newline="",encoding="utf-8")asf:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论