Python程序设计基础 课件 第七章 文件操作与异常_第1页
Python程序设计基础 课件 第七章 文件操作与异常_第2页
Python程序设计基础 课件 第七章 文件操作与异常_第3页
Python程序设计基础 课件 第七章 文件操作与异常_第4页
Python程序设计基础 课件 第七章 文件操作与异常_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

第七章文件操作与异常Python语言具有读写磁盘文件的能力。Python语言读写文件的方式与操作系统无关,具有一整套独立的文件读写处理系统。一般地,将这些文件分成三种,即文本文件、普通二进制文件和缓冲二进制文件(一种快速的二进制文件读写模式)。文本文件是由ASCII码组成的可读文件(即内容可理解的文件),这里重点介绍文本文件和Excel文件的读写操作,其中Excel文件的操作需要安装外部模块openpyxl(最新版本3.0.10,支持Excel2010)。第七章文件操作与异常计算机程序在执行过程中可能遇到各种各样的错误,甚至有些错误是不可预见的,例如向文件写入内容时发现内存不足等,这些非人为的错误称为程序异常。早期的计算机语言没有异常处理功能,主要是因为当时的计算机程序的代码量较少。随着计算机、操作系统和计算机语言的发展,计算机程序越来越庞大,特别是文件操作必须做访问安全性检查的要求,后续的计算机语言如Python、C++和C#等均具有异常管理能力。本章将分别用三小节来介绍文件操作和异常:7.1文件操作 7.2异常7.1.1磁盘文件读写操作 7.2.1自定义异常7.1.2os模块 7.2.2标准异常处理7.1.3Excel文件读写操作 7.2.3安全文件处理第七章文件操作与异常文件的写操作主要以下三步:(1)创建并打开文件,或者打开一个已存在的磁盘文件,借助于open函数实现;(2)从文件头开始向文件中写入数据,或者定位到文件的特定位置后从该位置开始写入数据,借助于函数write、writeline和seek等实现;(3)完成数据写入后,关闭文件,借助于函数close实现。关闭文件是必不可少的操作,Python语言程序的文件写入操作,是直接写入内存中为文件划定的一块区域,而关闭文件操作,才将这个内存区域中的内容写入到磁盘文件中去,因此,文件操作必须以close关闭文件结束(注意:下文的with结构将隐式调用close方法)。7.1文件操作文件的读操作也主要有三步:(1)打开一个已存在的文件,借助于open函数实现;(2)打开文件后,文件中的“读指针”指向文件开头,此时可以借助于read或readline从文件开头读取文件内容,也可以借助于seek函数将文件“读指针”定位于文件中的任意需要的位置,从该位置读出文件内容;(3)完成读文件操作后,借助于close函数关闭文件。在文件读操作中,close关闭文件操作也必不可少,读文件操作将创新一个文件在内存中的映射空间,读文件实质上是从这个内存中读取文件的内容,close关闭文件操作将清空这个内存区域,从而释放这块空间。在Python语言中,文件和目录的管理工作,例如,创建目录和删除文件等,由模块os管理。7.1文件操作打开文件open函数的语法为:file=open(待打开的文件名,读写方式(默认为只读方式),其他参数)函数open打开“待打开的文件名”表示的文件成功,则返回文件对象,赋给file;如果打开失败,将触发OSError异常。“待打开的文件名”为字符串,其中的目录分界符使用“\\”或使用带前缀r的字符串(其中目录分界符为“\”),“读写方式”。7.1.1磁盘文件读写操作除了open函数外,其余的文件对象常用方法还有:7.1.1磁盘文件读写操作下面将展示一个标准方式的文件读写操作实例:7.1.1磁盘文件读写操作if__name__=='__main__':f1=open('zy.txt','w')f1.write('Ourclasshas38students.')f1.close()f2=open('zy.txt','r')str=f2.readline()f2.close()print(str)f3=open('zy.txt','r')f3.seek(0,0)f3.seek(15)str=f3.read(2)f3.close()print('Thenumber:',str)以只写方式打开文件zy.txt,如果该文件不存在,则创建该文件,该文件位于当前工程所在目录。然后向文件对象f1指向的文件写入字符串“Ourclasshas38students.”。随后调用close函数关闭文件对象f1。以只读方式打开文件zy.txt,该文件中只有第3行写入的一行字符串。从f2对象指向的文件中读出一行字符串,赋给str。关闭f2文件对象。输出str,得到“Ourclasshas38students.”。以只读方式打开文件zy.txt,将文件对象赋给f3。再将文件内部“指针”指向文件头,这里的“0,0”中第一个0表示偏移0个字节,第二个0表示相对应文件头计算偏移量。文件对象刚打开时,文件内部“指针”自动指向文件头部。然后将文件内部“指针”移动到第15个字节处(字符串“Ourclasshas38students.”的字符“3”位置处)。从文件对象f3指向的文件的当前位置读取2个字节长的字符串,赋给str。关闭f3文件对象。输出读出的字符串str。一般地,常借助于with结构进行文件读写操作,with结构在文件读写完成后,将隐式调用close方法关闭文件。将上一个实例中的文件读写使用with结构表示如下:7.1.1磁盘文件读写操作if__name__=='__main__':withopen('zy.txt','w')asf1:f1.write('Ourclasshave38students.')withopen('zy.txt','r')asf2:str=f2.readline()print(str)withopen('zy.txt','r')asf3:f3.seek(0,0)f3.seek(15)str=f3.read(2)print('Thenumber:',str)在主函数中,分别使用三次with结构,实现上一个实例中的三次磁盘文件的读写操作,第一个with结构调用open函数以只写方式打开文件zy.txt,将文件对象赋给f1。执行文件对象f1的write操作。第二个with结构中从f2对象指向的文件中读出一行字符串,赋给str。第三个with结构以只读方式打开文件zy.txt,将文件对象赋给f3。改变文件内部的“指针”,再读取文件内容赋给str,并输出。os模块是Python语言内置的一个模块,提供了与操作系统的文件管理操作,使用os模块的函数或方法时,必须调用“importos”装载os模块。模块os中常用的文件和目录管理函数。7.1.2os模块下面将展示了os模块中的部分常用函数的用法。importosif__name__=='__main__':name=os.getcwd()+'\\zy.txt'ifos.path.exists(name):f1=open(name)str=f1.readline()f1.close()print(str)else:print(f"File{name}doesn'texist.")首先装载模块os,接着调用getcwd函数获取当前工程所在目录表示的字符串,并在该字符串后添加“\\zy.txt”以形成完成的文件路径名。然后调用path模块的exists方法判断name表示的文件是否存在,如果存在,则执行第5~8行;否则,输出文件不存在。以默认的只读方式打开name表示的文件,将文件对象赋给f1。然后从文件对象f1读取一行字符串,赋给str。再关闭文件对象f1。最后打印str字符串,输出“Ourclasshas38students.”。7.1.2os模块在Python语言中对Excel文件进行操作,需要借助于外部模块openpyxl。在openpyxl模块中,Workbook函数用于创建一个工作表对象,该工作表对象的create_sheet方法可以创建表单对象,将表单对象名做为create_sheet方法的参数。不妨设表单对象名为sheet1,则访问表单中的单元格可借助形式sheet1['单元格位置'],例如,sheet1['A1']表示第A列第1行的单元格;或者通过sheet1.cell方法访问,例如,sheet1.cell(row=1,column=1,value='3.0')表示向第A1号单元格写入字符串“3.0”。然后,工作表对象的save方法将工作表保存为Excel表格文件。7.1.3Excel文件读写操作下面的实例将介绍借助包openpyxl创建一个Excel文件zy.xlsx的方法:7.1.3Excel文件读写操作forrowinrange(2,11+1):forcolin['A','B','C']:matchcol:case'A':sheet1.cell(row=row,column=1,value=str(row-1))case'B':sheet1.cell(row=row,column=2,value='Grade'+str(row-1))case'C':sheet1.cell(row=row,column=3,value=f'{(row-1)*0.75:.2f}')case_:passbook.save(name)importopenpyxlasexcelif__name__=='__main__':name='zy.xlsx'book=excel.Workbook()sheet1=book.create_sheet('Sheet1')sheet1[‘A1’]=‘编号’sheet1['B1']='品名'sheet1['C1']='单价'首先装入包openpyxl,并赋别名excel,然后设定文件名为zy.xlsx,赋给name。随后调用Workbook函数创建工作表对象,赋给book。接着调用create_sheet方法创建表单对象,赋给sheet1。设置第A1单元格写入“编号”;设置第B1单元格写入“品名”;设置第C1单元格写入“单价”。使用双层for结构,外层for循环表示行row从2至11且按步长1递增。内层for循环表示列col从A至C,在每次循环中,判断col的值,如果col为A,则将“row-1”赋给第row行第1列的单元格;如果col为B,则将“Grade”与row-1的连接字符串赋给第row行第2列的单元格;如果col为C,则执行将0.75(row-1)的值赋给第row行第3列的单元格。下面的实例是介绍读取Excel电子表格文件的方法(代码的第一部分):7.1.3Excel文件读写操作importopenpyxlasexcelimportos.pathaspathif__name__=='__main__':name='zy.xlsx'ifpath.exists(name):book=excel.load_workbook(name,data_only=True)sheet=book.worksheets[1]m=len(list(sheet.rows))n=len(list(sheet.columns))print('----------------------')forcolin['A','B','C']:print(sheet[col+'1'].value,end='')print()print('----------------------')isfirst=True首先装载包openpyxl和模块os.path,并分别赋以别名excel和path。将文件名zy.xlsx赋给name。然后调用exists方法判断name表示的Excel文件是否存在于当前工程目录下,如果存在,则调用load_workbook方法从name表示的文件中读入整个表格,赋给book,这里的关键字参数“data_only=True”表示仅读出数值。接着从book对象中读入表单1,赋给sheet对象。再获取表单对象sheet包含的行数和列数,赋给m和n。随后使用一个for结构,输出表单对象的第一行,注意,在使用sheet[‘A1’]这种形式访问单元格时,列用A、B、C等(从A或a开始),行用数字1、2、3等(从1开始)。然后输出“编号品名单价”。将True赋给isfirst,用于控制后面的for结构中不输出表单sheet的第1行。forrowinsheet.rows:ifisfirst:isfirst=Falseelse:forcolinrange(n):ifcol==0:print(f'{row[col].value:<5}',end='')elifcol==1:print(f'{row[col].value:<8}',end='')else:print(f'{row[col].value:>5}',end='')print()print('----------------------')7.1.3Excel文件读写操作代码的第二部分:在for结构中,当遍历表单sheet的所有行时,如果为第一行,则执行else语句中的内层的for结构,作用是列col从第0列至第n-1列(注意,使用row对象访问单元格时,列的序号从0开始),依次输出表单对象sheet的第row行的各个单元格的数据,实际上这个内层for循环是用于输出表单对象sheet的第2~m行。实际上这个实例是介绍了两种访问Excel电子表格的表单数据的方法,其一为借助于形如“sheet[‘A1’]”的形式访问表单的第A1个单元格,其中的sheet为用户定义的表单对象;其二为借助于形如“row[col]”的形式访问第row行第col列的单元格,这里的row为sheet.rows对象,col从0开始索引,如果row为代表第1行的对象,那个row[0]表示第A1个单元格。程序在执行过程中偶然发生的错误,称为异常。有些异常是可以考虑到的,例如,除数可能为0的情况,有些异常则是无法提前预知的,例如,内存访问溢出等。异常的特点在于异常一旦发生(或被触发),将终止整个程序的运行,原因在于程序已经“跑飞”了(“跑飞”是指指挥程序运行的“程序计数器指针”不在程序有效指令范围内搜索指令了)。异常处理机制是指当程序运行过程中遇到异常时,将会跳转到异常处理程序进行“补救”,从而使程序恢复正常运行状态的技术。异常处理机制包括两种方式,其一为对于可预知的运行错误,例如除数为0等,这类异常遇到时,可通过raise语句人为抛出异常,调用异常处理程序处理这种异常,这种方式称主动控制型异常处理;其二为对于不可预知的运行异常,借助于异常处理机制,由系统抛出运行异常,程序被动地接收和处理异常,这种方式称被动防御型异常处理。7.2异常系统抛出的异常名以“Error”结尾,常见的异常如下:(1)ZeroDivisionError表示除数为0异常;(2)OSError表示系统异常,其中,FileNotFoundError异常是OSError的子类;(3)IndexError表示索引越界异常;(4)KeyError表示字典关键字错误异常;(5)NameError表示“标签”或变量错误异常,主要是指变量名不存在;(6)AssertionError由断言assert抛出的异常,这类异常也属于主动控制型异常处理,例如,“asserta>3:”当a不大于3时将抛出AssertionError异常;(7)AttributeError表示对象属性错误异常;(8)TypeError表示数据类型使用错误异常;(9)ValueError表示表达式运算出错异常或函数参数值出错异常。7.2异常在程序设计过程中,在预计可能会出现的错误处添加raise语句,抛出异常(直观上讲,可以认为异常不被“抛出”将终止程序的执行)。抛出的异常被try结构处理,典型的try结构为:try:可能会遇到错误的执行语句exceptExceptionase:异常处理语句在try结构中,try与except间的语句出现异常时,将被try结构捕获。这里的“Exception”是所有异常的基类,可以捕获所有被触发的异常;“ase”可以省略,添加上时,e作为Exception的对象,可用于“异常处理语句”中。7.2.1自定义异常下面的实例介绍了自定义异常的方法:if__name__=='__main__':a=int(input('Pleaseinputaninteger:'))try:ifa<0:raiseException('a<0')elifa<3:raiseException('0<=a<3')elifa<10:raiseException('3<=a<10')else:print(f'a1={a}')print(f'a2={a}')exceptExceptionase:print(e)print(f'a3={a}')在主函数中首先提示输入一个整数,赋给a。监督并捕获后续持续可能发生的异常。接着使用if-elif-else结构,将a的值分成四种情况进行判断,并执行条件语句后面相应的语句块。如果用户输入的a的值小于10,均将抛出异常,程序将直接跳转到“”exceptExceptionase:”执行,而“print(f'a2={a}')”不会被执行。只有当a大于等于10时,才会执行“print(f'a2={a}')”。当raise抛出异常时,将自动进入“except”的异常处理部分,这里的异常被捕获,并赋给Exception类的对象e,然后输出异常对象。由于使用了异常处理机制,尽管程序触发了异常,异常处理语句后的语句仍然正常执行,即无论有无异常,最后的输出语句均会正常执行,输出a的值。7.2.1自定义异常Python语言的被动式异常处理有如下三种情况:(1)通用型 在不能预知异常类型的情况下,使用“通用型”捕获全部异常,其形式为:try:

被监督的可执行语句exceptExceptionase:异常处理语句

这里的异常对象“e”的名称可以为任意合法的对象名。在这种结构下,当“被监督的可执行语句”中有语句触发异常时,将跳到“异常处理语句”处执行。7.2.2标准异常处理try结构可以带有else部分,如下:try:

被监督的可执行语句exceptExceptionase:

异常处理语句else:try部分没有发生异常时执行的语句这里的“else”部分只有try语句没有异常时才能执行到,如果有异常触发了,则else部分不会被执行到。(2)多异常捕获型在这种情况下,在捕获部分罗列尽可能多的异常,以精细地进行异常捕获,其形式如下所示:try:

被监督的可执行语句except异常类型1ase1:

异常处理语句......except异常类型nasen

异常处理语句exceptExceptionase:

异常处理语句else:try部分没有发生异常时执行的语句7.2.2标准异常处理在左边结构中,具有n个明确的异常类型捕获和处理部分,如果“被监督的可执行语句”触发的异常不属于上述n个异常类型,则将触发“Exception”通用异常,执行其下的异常处理语句。“else”部分为可选部分,当这部分存在时,如果没有异常触发,将执行“else”部分,否则,“else”部分不被执行。注意:在多异常捕获型异常处理结构中,只要异常被其中一个异常处理语句捕获,则该异常将不再被其他异常处理语句所捕获,而是执行异常处理结构后续的语句。(3)带finally的异常捕获结构这种结构中不能再带else部分,而是将else部分替换为finally部分,其形式如下:try:

被监督的可执行语句except异常类型1ase1:

异常处理语句......except异常类型nasen

异常处理语句exceptExceptionase:

异常处理语句finally:

无论try部分有没有发生异常,这部分语句始终被执行7.2.2标准异常处理if__name__==‘__main__’:a=3b=0try:c=a/bprint(c)exceptExceptionasex:print(f'ex={ex}')①下面的实例展示了上述异常处理结构:7.2.2标准异常处理try:c=a/bprint(c)exceptExceptionasep:print(f'ep={ep}')finally:print(f'a={a},b={b}.')

③try:c=a/bprint(c)exceptZeroDivisionErrorase1:print(f'e1={e1}')exceptValueErrorase2:print(f'e2={e2}')exceptExceptionase:print(f'e={e}')else:print(f‘c={c}.’)②通用型的异常处理结构,执行“c=a/b”时由于b为0触发ZeroDivisionError异常,该异常类为Exception的子类,将被异常处理部分捕获,所以输出相应的异常描述。多异常捕获型的异常处理结构,“c=a/b”除数为0异常将被ZeroDivisionError异常处理部分精准捕获,然后输出异常描述信息。跳出异常处理,即其他异常处理部分将不再捕获该异常。带finally部分的异常处理结构,try语句块为监督执行的语句“c=a/b”由于b为0触发除数为0异常,该异常导致程序被Exception类的对象ep捕获,并输出异常描述信息。无论是否有异常发生,finally语句块均被执行,输出a与b的值。借助于with结构进行文件的读写操作,是一种安全的文件处理方式,但是,with结构隐藏了文件读写的安全控制细节,所以,本节介绍的借助于带finally部分的异常处理机制进行安全文件读写的方式更具有实用性。在带有finally部分的异常处理结构中,finally部分无论有无异常触发,总被执行到。这一点特别适合于文件的安全读写处理。当文件操作出现错误(或称异常)时,将直接终止程序执行,因为没有执行关闭文件操作,从而会异致内存碎片等问题。因此,文件读写必须进行异常监督和管理。7.2.3安全文件处理下面的实例介绍了文件的安全读写操作方法:7.2.3安全文件处理if__name__=='__main__':fw=Nonename='xt.txt'try:fw=open(name,'w')fw.write("TodayisTuesday.")exceptExceptionase:print(e)finally:if(fw!=None):fw.close()

fr=Nonestr=Nonetry:fr=open(name)str=fr.read()exceptExceptionase:print(e

温馨提示

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

评论

0/150

提交评论