Python程序设计语言(第二版)(微课版)课件 李美珊 07-12 文件和文件夹操作-Python计算生态_第1页
Python程序设计语言(第二版)(微课版)课件 李美珊 07-12 文件和文件夹操作-Python计算生态_第2页
Python程序设计语言(第二版)(微课版)课件 李美珊 07-12 文件和文件夹操作-Python计算生态_第3页
Python程序设计语言(第二版)(微课版)课件 李美珊 07-12 文件和文件夹操作-Python计算生态_第4页
Python程序设计语言(第二版)(微课版)课件 李美珊 07-12 文件和文件夹操作-Python计算生态_第5页
已阅读5页,还剩265页未读 继续免费阅读

下载本文档

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

文档简介

主讲教师:姓名目录7.1文件概述7.2文件的操作7.2.1文件的打开与关闭7.2.2文件的读写7.2.3文件内容定位7.2.4文件对象常用属性7.2.5上下文管理语句with7.2.6CSV文件读写7.3文件夹操作7.4经典案例分析7.1文件概述

7.1.1文件文件是一组相关数据的集合和抽象。它可以长期保存、允许重复使用和反复修改。7.1文件概述

7.1.1文件文件是一组相关数据的集合和抽象。它可以长期保存、允许重复使用和反复修改。通过文件的属性可以区别不同的文件。一般情况下按文件名访问文件。7.1.2文件类型根据数据的组织形式,可以将文件分为文本文件和二进制文件两类。1、文本文件文本文件只包含基本文本字符。Windows平台中,扩展名.txt、.log和.ini的文件都属于文本文件。文本文件一般由单一特定编码的字符组成,如utf-8、GBK编码等;在读取和查看时需要使用正确的编码方式进行解码。图:文本文件“个人信息.txt”编码格式“utf-8”7.1.2文件类型根据数据的组织形式,可以将文件分为文本文件和二进制文件两类。(2)二进制文件二进制文件是以字节串(bytes)进行存储的;直接按数据的二进制编码组织数据,没有统一字符编码;常见的图形图像文件、音频视频文件、可执行文件、资源文件、数据库文件、各类Office文档等。图:word文件“实验10.docx”7.2文件的操作

7.2.1文件的打开与关闭1、文件打开与创建(1)open()函数语法格式:open(filename,mode='r',encoding=None)功能和参数含义如下:函数的功能是可以指定模式创建或打开某一文件并创建文件对象。参数filename指定要创建或打开的文件名称;参数mode是可选参数,表示打开文件后的处理方式;具体模式如表7.1所示。参数encoding指定对文本进行编码和解码的方式,只适用于文本模式,如GBK、utf-8、CP936等。7.2.1文件的打开与关闭表7.1文件打开模式模式说明r读模式,默认模式可省略;如果文件不存在则抛出异常FileNotFoundErrorw写模式,如果文件已存在先清空原有内容x写模式创建新文件,如果文件已存在则抛出异常FileExistsErrora追加模式,不覆盖文件中原有内容;如果文件不存在创建新文件进行写入b二进制模式,可与其他模式组合使用t文本模式,默认模式可省略+可与其他模式组合使用,在原有功能基础上增加读/写模式7.2.1文件的打开与关闭(2)创建或打开文件,并将其与文件对象file进行关联语法格式:file=open()例如:将文本文件file1.txt与文件对象f1进行关联。相对路径表示:>>>f1=open('file1.txt','w',encoding='utf-8')绝对路径表示:>>>f1=open('D:\\Python38\\file1.txt','w',encoding='utf-8')或>>>f1=open(r'D:\Python38\file1.txt','w',encoding='utf-8')>>>f1=open(R'D:\Python38\file1.txt','w',encoding='utf-8')7.2.1文件的打开与关闭2、关闭文件语法格式:file.close()功能含义:命令的功能是把内存的内容写入文件,同时关闭文件。例如:>>>f3=open('file3.txt','w+',encoding='utf-8')>>>f3<_io.TextIOWrappername='file3.txt'mode='w+'encoding='utf-8'>>>>f3.close()7.2.1文件的打开与关闭2、关闭文件语法格式:file.close()>>>print("文件是否关闭:",f3.closed)#属性closed判断文件是否关闭文件是否关闭:True>>>f3<_io.TextIOWrappername='file3.txt'mode='w+'encoding='utf-8'>文件对象f3关联的文本文件file3.txt已经关闭,但文件对象f3依然与file3.txt相关联,但是不允许对关闭的文件执行任何读写操作,若对关闭的文件进行读或写操作时系统会报错。7.2.2文件的读写1、写操作(1)write()方法语法格式:file.write(string)功能含义:功能是在文件当前插入点位置插入文本数据或二进制数据块的字符串,将字符串string原样写入并覆盖文件内容,返回写入的字符长度。7.2.2文件的读写1、写操作(1)write()方法语法格式:file.write(string)例如:>>>f1=open('file1.txt','w',encoding='utf-8')>>>f1.write('Python')6>>>f1.write('语言程序设计教程\n')9>>>f1.flush()>>>f1.close()7.2.2文件的读写1、写操作(2)writelines()方法语法格式:file.writelines(sequence)功能含义:功能是序列sequence原样写入文件当前插入点位置,可以一次性写入多个字符串,且不添加换行符。如果有需要要人为加上换行符'\n'。需要注意的是序列的元素必须是字符串。7.2.2文件的读写1、写操作(2)writelines()方法语法格式:file.writelines(sequence)例如:>>>f1=open('file1.txt','a',encoding='utf-8')>>>f1.writelines(['第一章','','Python概述','\n'])>>>f1.writelines([1,2,3])Traceback(mostrecentcalllast):File"<pyshell#15>",line1,in<module>f1.writelines([1,2,3])TypeError:write()argumentmustbestr,notint7.2.2文件的读写1、写操作(2)writelines()方法注意:writelines()方法的参数除了列表之外,也可以是集合、元组,甚至是字典,但是元素一定是字符串才可以。其中集合与字典做参数时,写入文件的内容形式和预期的会有不同。例如:>>>f1.writelines(('第二章','基本数据类型、运算符与表达式','\n','第三章程序控制结构\n'))>>>f1.close()7.2.2文件的读写1、写操作(3)print()函数语法格式:print(value1,value2,...,sep='',end='\n',file=sys.stdout)功能和参数含义:函数的功能是输出信息到标准控制台或指定文件。参数value1,value2,…需要输出的内容(可以有多个);参数sep参数用于指定数据之间的分隔符,默认为空格;参数end用于指定输出完数据之后再输出什么字符;参数file用于指定输出位置,默认为标准控制台,也可以重定向输出到文件。7.2.2文件的读写1、写操作(3)print()函数语法格式:print(value1,value2,...,sep='',end='\n',file=sys.stdout)例如:>>>f1=open('file1.txt','a',encoding='utf-8')>>>print('第四章组合序列结构',file=f1)>>>f1.close()7.2.2文件的读写2、读操作(1)read()方法语法格式:file.read([size])功能和参数说明:功能是从文本文件指针当前位置读取size个字符(Python3.x)的内容,以一个字符串作为结果返回;或从二进制文件中读取size指定数量的字节并返回。如果省略size则表示从当前位置读取文件所有内容。7.2.2文件的读写2、读操作(1)read()方法语法格式:file.read([size])例如:以读模式打开文本文件“file1.txt”进行读取>>>f1=open('file1.txt','r',encoding='utf-8')>>>f1.read(8)'Python语言'>>>f1.read(2)'程序'7.2.2文件的读写2、读操作(1)read()方法语法格式:file.read([size])>>>f1.read()'设计教程\n第一章Python概述\n第二章基本数据类型、运算符与表达式\n第三章程序控制结构\n第四章组合序列结构\n'>>>f1.read()''>>>f1.close()7.2.2文件的读写2、读操作(2)readline()方法语法格式:file.readline()功能说明:读出文件中当前行,以一个字符串的形式作为结果返回。例如:依次读取“file1.txt”每一行。>>>f1=open('file1.txt','r',encoding='utf-8')>>>f1.readline()'第一章Python概述\n'>>>f1.readline()'第二章基本数据类型、运算符与表达式\n'7.2.2文件的读写2、读操作(2)readline()方法语法格式:file.readline()>>>f1.readline()'第三章程序控制结构\n'>>>f1.readline()'第四章组合序列结构\n'>>>f1.readline()''>>>f1.close()7.2.2文件的读写【例7-1】编写程序,用循环语句读取并显示文本文件file1.txt,统计文件的行数和字符数。123456789101112#读取并显示文件file1.txt,统计文件的行数和字符数s1=s2=0f1=open('file1.txt','r',encoding='utf-8')ss=f1.readline()whiless!='':print(ss,end='')s1=s1+1s2=s2+len(ss)ss=f1.readline()f1.close()print('文件共'+str(s1)+'行')print('文件共'+str(s2)+'字符')7.2.2文件的读写【例7-1】编写程序,用循环语句读取并显示文本文件file1.txt,统计文件的行数和字符数。运行结果:7.2.2文件的读写【例7-2】按行显示file1.txt的内容。12345#按行显示file1.txt的内容f1=open('file1.txt','r',encoding='utf-8')forlineinf1:print(line,end='')f1.close()7.2.2文件的读写【例7-2】按行显示file1.txt的内容。运行结果:7.2.2文件的读写2、读操作(3)readlines()方法语法格式:file.readlines([sizeint])功能和参数说明:读取所有行并返回列表,每行文本以一个字符串的形式作为列表中的一个元素。若给定sizeint>0,返回总和大约为sizeint字节的行,实际读取值可能比sizeint较大,因为需要填充缓冲区。7.2.2文件的读写2、读操作(3)readlines()方法语法格式:file.readlines([sizeint])例如:>>>f1=open('file1.txt','r',encoding='utf-8')>>>f1.readlines()['Python语言程序设计教程\n','第一章Python概述\n','第二章基本数据类型、运算符与表达式\n','第三章程序控制结构\n','第四章组合序列结构\n']>>>f1.close()7.2.3文件内容定位1、tell()方法语法格式:file.tell()功能说明:返回文件指针的当前位置。例如:读模式打开文本文件“text2.txt”,读取字符。>>>f2=open('file2.txt','r')>>>f2.tell()0>>>f2.read(10)'Helloworl'>>>f2.tell()107.2.3文件内容定位1、tell()方法语法格式:file.tell()>>>f2.read(10)#文件剩余部分不足10个字符按实际输'd!\n'>>>f2.tell()14>>>f2.close()7.2.3文件内容定位2、seek()方法语法格式:file.seek(offset[,whence])参数说明:把文件指针移动到新的字节位置。seek函数可以接收偏移量offset和选项whence作为参数,返回执行seek()后的位置。offset表示相对于whence的位置。当whence=0时,将文件指针从文件头部转移到偏移量offset指定的字符处;当whence=1时,将文件指针从文件的当前位置往后转移偏移量offset指定的字符数处;当whence=2时,将文件指针从文件尾部向后移动偏移量offset指定的字符数。whence默认值为0,file.seek(0)表示文件指针移动到文件头位置。7.2.3文件内容定位2、seek()方法语法格式:file.seek(offset[,whence])例如:>>>f1=open('file1.txt','r',encoding='utf-8')>>>f1.readline()'Python语言程序设计教程\n'>>>f1.readline()'第一章Python概述\n'>>>f1.tell()56>>>f1.seek(0)07.2.3文件内容定位2、seek()方法语法格式:file.seek(offset[,whence])>>>f1.readline()'Python语言程序设计教程\n'>>>f1.seek(1,0)1>>>f1.tell()1>>>f1.readline()'ython语言程序设计教程\n'7.2.3文件内容定位2、seek()方法语法格式:file.seek(offset[,whence])>>>f1.tell()32>>>f1.seek(0,1)32>>>f1.seek(1,1)Traceback(mostrecentcalllast):File"<pyshell#75>",line1,in<module>f1.seek(1,1)io.UnsupportedOperation:can'tdononzerocur-relativeseeks在文本文件中,只允许从文件头开始计算相对位置,从文件当前位置或尾计算时就会引发异常。7.2.3文件内容定位【例7-3】在file3.txt中写入如下诗句,在第一句后面添加一个换行。Wheneveryouneedme,I’llbehere.Wheneveryouareintrouble,Imalwaysnear.12345678910#在file3.txt中写入诗句,修改添加一个换行f3=open('file3.txt','w+')s1='Wheneveryouneedme,I\'llbehere.'s2='Wheneveryouareintrouble,Imalwaysnear.'f3.write(s1)f3.write(s2)f3.flush()f3.seek(0)print('修改前')print(f3.readline(),end='')111213141516171819n=len(s1)f3.seek(n)f3.write('\n')f3.flush()print('\n修改后')f3.seek(0)forlineinf3:print(line,end='')f3.close()7.2.3文件内容定位【例7-3】在file3.txt中写入如下诗句,在第一句后面添加一个换行。Wheneveryouneedme,I’llbehere.Wheneveryouareintrouble,Imalwaysnear.运行结果:7.2.4文件对象常用属性表7.2文件对象常用属性属性说明name返回文件名称mode返回文件打开模式closed判断文件是否关闭,关闭Truebuffer返回当前文件的缓冲区对象fileno返回文件号7.2.4文件对象常用属性例如>>>f1=open('file1.txt','r',encoding='utf-8')>>>print("文件名为:",)文件名为:file1.txt>>>print("文件打开模式:",f1.mode)文件打开模式:r>>>print("文件是否关闭:",f1.closed)文件是否关闭:False>>>print("文件缓冲区对象:",f1.buffer)文件缓冲区对象:<_io.BufferedReadername='file1.txt'>>>>f1.close()>>>print("文件是否关闭:",f1.closed)文件是否关闭:True7.2.5上下文管理语句with语法格式:withopen(filename,mode,encoding)asfile:

代码块

#这里写通过文件对象读写文件内容的语句功能和参数说明:该语句可以保证文件被正确关闭,在代码块执行完毕后自动还原进入该代码块时的上下文。参数其中filename,mode,encoding和file参数的含义与open()函数参数相同。7.2.5上下文管理语句with【例7-4】编写程序修改xj.txt的信息内容,在学号前面加上“学号:”,在姓名前面加上“姓名:”,然后用循环语句在屏幕上显示xj.txt修改后个人全部信息。文本文件xj的内容如图7-5所示。7.2.5上下文管理语句with【例7-4】编写程序修改xj.txt的信息内容,在学号前面加上“学号:”,在姓名前面加上“姓名:”,然后用循环语句在屏幕上显示xj.txt修改后个人全部信息。文本文件xj的内容如图7-5所示。1234567891011#修改xj.txt的信息内容withopen('xj.txt','r+')asf:l1=['学号:']+list(f.readline())l2=['姓名:']+list(f.readline())f.seek(0)f.writelines(l1)f.writelines(l2)f.flush()f.seek(0)forlineinf:print(line,end='')7.2.5上下文管理语句with【例7-4】编写程序修改xj.txt的信息内容,在学号前面加上“学号:”,在姓名前面加上“姓名:”,然后用循环语句在屏幕上显示xj.txt修改后个人全部信息。文本文件xj的内容如图7-5所示。运行结果:7.2.5上下文管理语句with上下文管理语句with还可以同时打开多个文件进行读写操作。with语句也可以使用嵌套结构12withopen('test.txt','r')asold,open('test_new.txt','w')asnew:new.write(old.read())123withopen('test.txt','r')asold:withopen('test_new.txt','w')asnew:new.write(old.read())7.2.6CSV文件读写CSV文件可以理解为用带逗号分隔的纯文本形式存储表格数据的文件。文件由记录组成,一行对应一条记录,每行开头不留空格,每条记录被英文半角分隔符分割为多个字段。CSV文件的分隔符不限定为逗号,可以是分号、制表符等。7.2.6CSV文件读写1、写入CSV文件(1)创建writer对象语法格式:writer=csv.writer(csvfile,dialect='excel',newline=None)参数说明:csvfile支持迭代的对象,并且每次调用next方法的返回值是字符串,通常的文件对象或者列表对象都是适用的。dialect编码风格,默认为excel方式,也就是逗号分隔。另外CSV模块也支持excel-tab风格,也就是用制表符tab分隔等。参数newline是用来控制一行的结束字符。可以是None,'','\n','\r','\r\n'等。7.2.6CSV文件读写1、写入CSV文件(1)创建writer对象语法格式:writer=csv.writer(csvfile,dialect='excel',newline=None)例如:打开“stu.csv”,建立了writer对象wr。>>>importcsv>>>f_csv=open("stu.csv",'w')>>>wr=csv.writer(f_csv)>>>f_csv.close()7.2.6CSV文件读写1、写入CSV文件(2)writerow()方法语法格式为:writer.writerow(list)功能说明:将用列表存储的一行数据写入文件。7.2.6CSV文件读写1、写入CSV文件(2)writerow()方法例如:向文件中添加首行内容“学号”,“姓名”,“性别”和“年龄”,然后追加两条记录,“20010801”,“张兰”,“女”,“17”和“20010802”,“刘毅强”,“男”,“17”。>>>withopen("stu.csv",'w',newline='')asf_csv: wr=csv.writer(f_csv)#创建witer对象 wr.writerow(['学号','姓名','性别','年龄']) wr.writerow(['20010801','张兰','女','17']) wr.writerow(['20010802','刘毅强','男','17'])

13187.2.6CSV文件读写1、写入CSV文件(3)writerows()方法语法格式:writer.writerows(sequence)功能说明:是将序列sequence中的每一个元素作为一行写入CSV文件。例如:下列命令利用writerows()方法一次写入两行记录。>>>importcsv>>>withopen("stu.csv",'a+',newline='')asf_csv: wr=csv.writer(f_csv) wr.writerows([['20010803','王小明','男','16'],('20010804','刘欣欣','女','18')])7.2.6CSV文件读写2、读取CSV文件(1)创建reader对象语法格式:reader=csv.reader(csvfile,dialect='excel')功能和参数说明:创建reader对象,以列表的形式输出每一行。csvfile需要支持迭代的对象,并且每次调用next方法的返回值是字符串,通常的文件对象,或者列表对象都是适用的。dialect编码风格,默认为excel方式,也就是逗号分隔。另外CSV模块也支持excel-tab风格,也就是用制表符tab分隔等。7.2.6CSV文件读写2、读取CSV文件(1)创建reader对象语法格式:reader=csv.reader(csvfile,dialect='excel')例如:通过迭代遍历reader对象来遍历文件中的每一行。>>>importcsv>>>withopen("stu.csv",'r')asf_csv: reader=csv.reader(f_csv) forrowinreader: print(row)

运行结果:['学号','姓名','性别','年龄']['20010801','张兰','女','17']['20010802','刘毅强','男','17']['20010803','王小明','男','16']['20010804','刘欣欣','女','18']7.3文件夹操作目录是用来组织和管理一组相关的文件和文件夹。目录又可称为文件夹,可以包含文件,也可以包含其他目录。文件的保存位置称为路径。7.3.1绝对路径与相对路径1、绝对路径绝对路径是指从文件所在驱动器名称即“盘符”开始描述文件的保存位置。例如:C:\Exam\88772\编程题\1\py_source_file1.py在Python程序中,文件的路径可以使用字符串来表示。

例如:"C:\\Exam\\88772\\编程题\\1\\py_source_file1.py"

或者

r"C:\Exam\88772\编程题\1\py_source_file1.py"R"C:\Exam\88772\编程题\1\py_source_file1.py"7.3.1绝对路径与相对路径2、相对路径每个运行的程序都有一个当前工作的目录,称为当前目录。相对路径是指从当前工作目录开始描述文件的保存位置,即从当前路径出发表示一个文件。若当前目录为C:\Exam\88772,则py_source_file1.py文件的相对路径就是“编程题\1\py_source_file1.py”。7.3.2目录操作表7.3常用目录(文件夹)操作方法函数功能说明os.getewd()返回当前工作目录os.listdir(path)返回path目录下的文件和目录列表os.chdir(path)改变当前工作目录,path提供设置成当前目录的目录名称的参数。os.rmdir(path)删除path指定的空目录,如果目录非空则抛出一个OSError异常os.mkdir(path[,mode])以数字的mode创建一个名为path的文件夹。默认的mode是0777(八进制)path提供一个包含了要创建的目录名的参数os.rename(scr,dst)重命名文件或目录,scr参数为文件或目录、dst参数为新文件名或新目录名,可以实现文件的移动,若目标文件已存在则抛出异常;不能跨越磁盘或分区进行操作os.replace(old,new)重命名文件或目录,若目标文件已存在则直接覆盖;不能跨越磁盘或分区操作7.3.3文件操作表7.4常用文件操作方法方法功能说明os.rename(scr,dst)重命名文件或目录,scr参数为文件或目录、dst参数新文件名或新目录名,可以实现文件的移动,若目标文件已存在则抛出异常;不能跨越磁盘或分区操作os.replace(old,new)重命名文件或目录,若目标文件已存在则直接覆盖;不能跨越磁盘或分区操作os.remove([path]file_name)删除路径为path的文件file_name。如果只有路径缺失文件名将抛出异常;删除指定的文件,要求用户拥有删除文件的权限,并且文件没有只读或其他特殊属性7.4经典案例分析【例7-5】以编码格式utf-8写模式创建文件f1.txt,创建文件对象f,屏幕上输出文件名称再关闭文件f1.txt,并判断文件是否关闭。12345678#编码格式utf-8创建文件f1.txt,输出文件名,关闭文件、判断文件是否关闭f=open('f1.txt','w',encoding='utf-8')print("文件名为:",)f.close()iff.closed:print("文件已关闭")else:print("文件未关闭")7.4经典案例分析【例7-5】以编码格式utf-8写模式创建文件f1.txt,创建文件对象f,屏幕上输出文件名称再关闭文件f1.txt,并判断文件是否关闭。运行结果:7.4经典案例分析【例7-6】将三个字符串写入文本文件sample.txt,然后再读取并输出。1234567#字符串写入文本文件sample.txt,然后再读取并输出withopen('sample.txt','w')asfp:fp.write("Helloworld!\n")fp.write("HelloPython!\n")fp.write("Helloeveryone!")withopen('sample.txt')asfp:print(fp.read())7.4经典案例分析【例7-6】将三个字符串写入文本文件sample.txt,然后再读取并输出。运行结果:7.4经典案例分析【例7-7】遍历gs.txt所有内容且在屏幕上输出,统计输出字符个数。(gs.txt编码格式为utf-8)【分析1】直接遍历文件对象1234567#遍历显示,统计古诗gs.txt字符个数s=0withopen('gs.txt','r',encoding='utf-8')asf:forlineinf:print(line,end='')s=s+len(line)print('字符个数为',s)7.4经典案例分析【例7-7】遍历gs.txt所有内容且在屏幕上输出,统计输出字符个数。(gs.txt编码格式为utf-8)【分析2】读取文件对象按行生成列表再遍历列表12345678#遍历显示,统计古诗gs.txt字符个数s=0withopen('gs.txt','r',encoding='utf-8')asf:list_f=f.readlines()forlineinlist_f:print(line,end='')s=s+len(line)print('字符个数为',s)7.4经典案例分析【例7-7】遍历gs.txt所有内容且在屏幕上输出,统计输出字符个数。(gs.txt编码格式为utf-8)【分析3】计算文本文件行数,循环文件行数次来读取文件每一行12345678910#遍历显示,统计古诗gs.txt字符个数s=0withopen('gs.txt','r',encoding='utf-8')asf:n=len(f.readlines())f.seek(0)foriinrange(1,n+1):line=f.readline()print(line,end='')s=s+len(line)print('字符个数为',s)7.4经典案例分析【例7-7】遍历gs.txt所有内容且在屏幕上输出,统计输出字符个数。(gs.txt编码格式为utf-8)运行结果:7.4经典案例分析【例7-8】统计文本文件sample.txt中最长行的长度,显示该行的内容。123456789#统计sample.txt中最长行的长度withopen('sample.txt')asfp:result={'最长长度':0,'最长行内容':''}forlineinfp:t=len(line)ift>result['最长长度']:result['最长长度']=len(line)result['最长行内容']=lineprint(result)7.4经典案例分析【例7-8】统计文本文件sample.txt中最长行的长度,显示该行的内容。运行结果:7.4经典案例分析【例7-9】将一个文本文件的内容转化为另一个编码格式的文本文件。12345678910111213#转化文件编码格式deffileCopy(old,oldEncoding,new,newEncoding):withopen(old,'r',encoding=oldEncoding)asoldfp,open(new,'w',encoding=newEncoding)asnewfp:newfp.write(oldfp.read())print('已生成文件{},编码格式为{}'.format(new,mod2))

name1=input('输入需要转化的文件名:')mod1=input('输入文件的编码格式:')name2=input('输入转化后的文件名:')mod2=input('输入文件新的的编码格式:')fileCopy(name1,mod1,name2,mod2)7.4经典案例分析【例7-9】将一个文本文件中内容转化为另一个编码格式的文本文件。运行结果:7.4经典案例分析【例7-10】before.txt文件中存放的是一些整数组成的字符串,其中包含空白字符和逗号。读取before.txt文件中所有整数,按升序排序后将结果以字符串形式写入文本文件after.txt中。【分析】1、读取before.txt所有行,删除每行两侧的空白字符,合并所有行,分隔得到所有数字字符串;2、按数值生成列表,排序,按字符连接成字符串,写入after.txt。12345678910111213141516171819#before.txt文件中所有整数,按升序排序后写入文本文件after.txtprint('before文件中的内容是:')withopen('before.txt')asf:forlineinf:print(line)withopen('before.txt','r')asfp:data=fp.readlines()data=[line.strip()forlineindata]data=','.join(data)data=data.split(',')data=[int(item)foritemindata]data.sort()data=','.join(map(str,data))withopen('after.txt','w')asfp:fp.write(data)print('after文件中的内容是:')withopen('after.txt')asf:forlineinf:print(line)7.4经典案例分析【例7-10】before.txt文件中存放的是一些整数组成的字符串,其中包含空白字符和逗号。读取before.txt文件中所有整数,按升序排序后将结果以字符串形式写入文本文件after.txt中。运行结果:7.4经典案例分析【例7-11】对Doctorlist.csv文件的读写操作。123456789101112#对Doctorlist.csv文件的读写操作importcsvnamelist=[['Doctor','No'],['Kate','K_09121'],['Alice','G_07151'],['Agnes','G_07213'],['Caroline','H_08431']]withopen('Doctorlist.csv','w',newline='')asD_file:csvout=csv.writer(D_file)csvout.writerows(namelist)withopen('Doctorlist.csv','r')ascsv_file:csv_content=[rowforrowincsv.reader(csv_file)]print('Doctorlist的内容是:')forlineincsv_content:print('{:<10}{:>10}'.format(line[0],line[1]))7.4经典案例分析【例7-11】对Doctorlist.csv文件的读写操作。运行结果:7.4经典案例分析【例7-12】从键盘输入姓名,在“通信录.csv”文件中查找此人的信息,如果找到就以列表的形式显示该条记录,否则显示“查无此人!”。通信录.csv文件字段为:姓名,手机号,微信号。可以通过下列示例表7.5测试程序。表7.5测试数据

测试数据输出数据示例1张兰['张兰',,'zl982323']示例2王二查无此人!7.4经典案例分析123456789101112#输入姓名查找记录name=input("输入姓名:")importcsvwithopen("通信录.csv","r")astcsv:reader=csv.reader(tcsv)forrowinreader:ifrow[0]==name:res=rowbreakelse:res="查无此人!"print(res) 7.4经典案例分析【例7-12】从键盘输入姓名,在“通信录.csv”文件中查找此人的信息,如果找到就以列表的形式显示该条记录,否则显示“查无此人!”。通信录.csv文件字段为:姓名,手机号,微信号。运行结果:7.4经典案例分析【例7-13】复制备份表bf.csv内容至学籍表xj.csv。备份表bf.csv字段为:学号,姓名,性别,年龄;在xj.csv中追加一条记录:'20123','张芳','女','20';最后按行显示xj.csv的记录。7.4经典案例分析1234567891011121314#复制文件,添加记录importcsvwithopen("bf.csv",'r')asstucsv:data=list(csv.reader(stucsv))withopen("xj.csv",'w',newline='')asstucsv:writer=csv.writer(stucsv)m=len(data)foriinrange(m):writer.writerow(data[i])writer.writerow(['20123','张芳','女','20'])withopen("xj.csv",'r')asstucsv:reader=csv.reader(stucsv)forrowinreader: print(row)7.4经典案例分析【例7-13】复制备份表bf.csv内容至学籍表xj.csv。备份表bf.csv字段为:学号,姓名,性别,年龄;在xj.csv中追加一条记录:'20123','张芳','女','20';最后按行显示xj.csv的记录。运行结果:主讲教师:姓名目录8.1Python的异常8.2常用的异常处理方法8.2.1

捕获处理异常8.2.2

触发异常8.3断言与上下文管理语句8.1Python的异常

8.1.1Python异常的原因写程序时由于疏忽或者考虑不全造成了错误;例如除数为零,下标越界,读模式打开了一个不存在的文件或打开文件时磁盘空间不足,网络异常,计算时类型错误,名字错误,访问了字典中不存在的键等等。8.1.2Python常见的异常表8.1常见异常及其描述异常名称描述BaseException所有异常的基类Exception常见异常的基类AttributeError属性错误FileNotFoundError文件不存在IndexError序列中没有这个索引IOError输入输出操作失败KeyError映射中没有这个键NameError未声明/初始化对象SyntaxError语法错误TypeError操作类型/参数类型不匹配ValueError传入无效的参数ZeroDivisionError除数为零8.2常用的异常处理方法

8.2.1捕获处理异常处理异常的基本思路:首先运行代码,如果不发生异常,就正常执行;如果发生了异常,就尝试捕获异常并进行处理,处理不了的才会导致程序崩溃。8.2常用的异常处理方法

8.2.1捕获处理异常1、try…except语句语法格式:try:

代码块

1#可能引发异常的代码exceptException1[asreason1]:

代码块

2#用来处理异常的代码[exceptException2[asreason2]:

代码块3

#用来处理异常的代码…]代码块

1是否异常T是否是异常1F是否是异常2TFF代码块2代码块3T是否是异常m代码块mT8.2常用的异常处理方法

8.2.1捕获处理异常1、try…except语句功能和参数说明:try子句中的代码块1包含可能引发异常的语句。except子句用来捕获相应的异常,Exception是异常名称,[asreason]表示定义异常实例。如果在执行代码块1的过程中发生了异常,那么try子句余下的部分将被忽略;一旦try子句中的代码抛出异常,就按顺序依次检查与哪一个except子句匹配。如果某个except子句捕获到异常,就执行其相应的代码块,其他的except子句将不再捕获异常。如果代码块1在执行时没有出现异常,就跳过except子句,继续往下执行异常处理结构后面的代码。如果异常出现但没有被except子句捕获,就继续往外层抛出异常;如果所有层都没有捕获并处理异常,那么程序就会崩溃并将异常信息呈现给用户。8.2.1捕获处理异常1、try…except语句【例8-1】输入一个数求绝对值,输入的数据不合法就重新输入。12345678910#求数的绝对值whileTrue:

x=input("请输入一个数")try:

x=float(x)print("您输入的是{},绝对值是{}".format(x,abs(x)))

breakexceptExceptionase:

print("您输入的是{},{}".format(x,e))print("错误!请重新输入!")8.2.1捕获处理异常1、try…except语句【例8-1】输入一个数求绝对值,输入的数据不合法就重新输入。运行结果:8.2.1捕获处理异常2、try…except…else语句语法格式如下:try:

代码块1#可能会引发异常的代码exceptException1[asreason1]:

代码块2#用来处理异常的代码[exceptException2[asreason2]:

代码块3#用来处理异常的代码…][else:

代码块n]

#未发生异常时执行的代码代码块

1是否异常T是否是异常1F是否是异常2TFF代码块2代码块3T是否是异常m代码块mT代码块n8.2.1捕获处理异常2、try…except…else语句功能和参数说明:

try子句中的代码块1包含可能引发异常的语句。except子句用来捕获相应的异常,Exception是异常名称,[asreason]表示定义异常实例。如果在执行代码块1的过程中发生了异常,那么try子句余下的部分将被忽略。一旦try子句中的代码抛出异常,就按顺序依次检查与哪一个except子句匹配。如果某个except子句捕获到异常,其他的except子句将不再捕获异常。

如果代码块1在执行时没有出现异常,就跳过except子句,执行else子句中的代码块n。如果异常出现但没有被except子句捕获,就继续往外层抛出异常;如果所有层都没有捕获并处理异常,那么程序就会崩溃并将异常信息呈现给用户。8.2.1捕获处理异常【例8-3】改写例8-2输入两个数a和b,求a除以b的结果。12345678910111213#改写求a除以b的结果x=input("请输入数a:")y=input("请输入数b:")try:z=float(x)/float(y)exceptZeroDivisionError:print("您输入的a是{},b是{}".format(x,y))print("除数为0!请重新输入!")exceptException:print("您输入的a是{},b是{}".format(x,y))print("数据错误!请重新输入!")else:print("您输入的a是{},b是{},a/b的结果为{}".format(x,y,float(x)/float(y)))8.2.1捕获处理异常【例8-3】改写例8-2输入两个数a和b,求a除以b的结果。运行结果:8.2.1捕获处理异常3、try…except…finally语句语法格式:try:

代码块1#可能会引发异常的代码exceptException1[asreason1]:

代码块2#处理异常的代码[exceptException2[asreason2]:

代码块3#处理异常的代码…][else:代码块n]

#未发生异常时执行的代码[finally:

代码块n+1]#无论try子句中的代码是否引发异常,都会执行这里的代码代码块n+1代码块

1是否异常T是否是异常1F是否是异常2TFF代码块2代码块3T是否是异常m代码块mT代码块n8.2.1捕获处理异常【例8-4】对多种异常的测试。12345678910#对多种异常的测试deftest(x):

try:eval(x)

exceptNameErrorase:print("error1:",e)exceptZeroDivisionErrorase:print("error2:",e)exceptTypeErrorase:print("error3:",e)11121314151617181920exceptSyntaxErrorase:print("error4:",e)

else:print('没有异常')

finally:print('无论异常与否,都会执行我')

x=input("输入测试数据:")test(x)8.2.1捕获处理异常【例8-4】对多种异常的测试。运行结果:异常系统默认异常自定义异常为了便于程序的设计和维护,把一些不会引起默认异常的情况作为异常来处理。给小学生出计算题,减数不能大于被减数。输入一个字符串作为验证码,字符串长度控制在5~10之间。输入的电话号码字符串只能是数字,且长度为11位。除数为零;对一个字符型数据进行加运算;使用了不存在的变量;使用读模式打开一个不存在的文件;8.2.2触发异常8.2.2触发异常语法格式如下:raise[Exception]语句中Exception指定了抛出的异常(例如ValueError),它必须是一个异常的实例或者是异常的类,也就是Exception的子类。8.2.2触发异常【例8-5】定义一个函数,计算两个数的差时,当减数大于被减数时抛出“减数不能大于被减数!”的异常。输入两个数进行测试。1234567891011#自定义异常求差deftest(a,b):ifb>a:

raiseBaseException('减数不能大于被减数')else:returna-b

x=eval(input("输入被减数"))y=eval(input("输入减数"))print("两个数的差为",test(x,y))8.2.2触发异常【例8-5】定义一个函数,计算两个数的差时,当减数大于被减数时抛出“减数不能大于被减数!”的异常。输入两个数进行测试。执行结果:8.2.2触发异常【例8-6】输入一个字符串,字符串长度控制在5~10之间。123456789101112#判断字符串长度是否在5~10之间deftest(s):if(len(s)<5)or(len(s)>10):raiseValueError('字符串长度在5~10之间!')

s=input('输入一个字符串:')try:test(s)exceptExceptionasa:print(a)print("您输入的是:",s)8.2.2触发异常【例8-6】输入一个字符串,字符串长度控制在5~10之间。运行结果:8.2.2触发异常【例8-7】输入被除数和除数,求商。1234567891011121314#求商defnot_zero(num):try:ifnum==0:raiseValueError('除数不能为0!')returnnumexceptExceptionase:print(e)

x=eval(input("输入被除数:"))y=eval(input("输入除数:"))ifnot_zero(y):print('商为:{}'.format(x/y))8.2.2触发异常【例8-7】输入被除数和除数,求商。运行结果:8.3断言与上下文管理语句Python断言语句assert也是一种比较常用的代码调试技术,常用来在程序的某个位置。上下文管理(contextmanager)语句with可以自动管理资源,不论因为什么原因哪怕是代码引发了异常跳出with块,总能保证文件被正确关闭。本章知识导图9.1中文文本分析相关库jieba库概述1.jieba库安装与使用安装:pipinstalljieba导入:importjieba2.jieba分词的原理jieba分词依靠中文词库,利用一个中文词库,确定汉字之间的关联概率,通过图结构和动态规划方法找到最大概率的词组,汉字间概率大的组成词组,最终形成分词结果。9.1中文文本分析相关库3.jieba分词的三种模式(1)精确模式(2)全模式(3)搜索引擎模式9.1中文文本分析相关库4.jieba库的主要函数函数描述jieba.cut(s)精确模式,返回一个可迭代的数据类型jieba.cut(s,cut_all=True)全模式,输出文本s中所有可能的单词jieba.cut_for_search(s)搜索引擎模式,适合搜索引擎建立索引的分词结果jieba.lcut(s)精确模式,返回一个列表类型,建议使用jieba.lcut(s,cut_all=True)全模式,返回一个列表类型,建议使用jieba.lcut_for_search(s)搜索引擎模式,返回一个列表类型,建议使用jieba.add_word(w)向分词词典中增加新词w9.1中文文本分析相关库【例9-1】精确模式分词。>>>importjieba>>>s="庆祝中国共产党建党100周年">>>forxinjieba.cut(s):#返回的是一个可迭代的类型

print(x,end='')庆祝中国共产党建党100周年>>>jieba.lcut(s)#返回的是一个列表['庆祝','中国共产党','建党','100','周年']9.1中文文本分析相关库【例9-2】全模式分词。>>>importjieba>>>s="庆祝中国共产党建党100周年">>>forxinjieba.cut(s,cut_all=True):

print(x,end='')庆祝中国中国共产党国共共产共产党党建建党100周年>>>jieba.lcut(s,cut_all=True)['庆祝','中国','中国共产党','国共','共产','共产党','党建','建党','100','周年']9.1中文文本分析相关库【例9-3】搜索引擎模式分词。>>>importjieba>>>s="庆祝中国共产党建党100周年">>>forxinjieba.cut_for_search(s):

print(x,end='')庆祝中国国共共产共产党中国共产党建党100周年>>>jieba.lcut_for_search(s)['庆祝','中国','国共','共产','共产党','中国共产党','建党','100','周年']9.1中文文本分析相关库【例9-4】添加新词。>>>importjieba>>>s="青春须早为,岂能长少年">>>jieba.lcut(s)['青春','须','早','为',',','岂能','长','少年']9.1中文文本分析相关库【例9-4】添加新词。>>>jieba.add_word("须早为")>>>jieba.add_word("长少年")>>>jieba.lcut(s)['青春','须早为',',','岂能','长少年']9.1中文文本分析相关库4、词性标注词性(part-of-speech)是词汇基本的语法范畴,通常也称为词类,主要用来描述一个词在上下文的作用。9.1中文文本分析相关库4、词性标注词性(part-of-speech)是词汇基本的语法范畴,通常也称为词类,主要用来描述一个词在上下文的作用。【例9-5】引入词性标注。>>>importjieba.possegaspsg#引入词性标注接口>>>text="奋斗百年路,起航新征程,庆祝建党100周年!">>>seg=psg.cut(text)

温馨提示

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

评论

0/150

提交评论