单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,7,章,文件和数据格式化,第7章文件和数据格式化,文件的使用,文件的使用,?,文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容。概念上,,文件是数据的集合和抽象,类似地,函数是程序的集合和抽象。用文件形式组,织和表达数据更有效也更为灵活。文件包括两种类型:文本文件和二进制文件。,?,文本文件一般由单一特定编码的字符组成,如,UTF-8,编码,内容容易统一展示,和阅读。大部分文本文件都可以通过文本编辑软件或文字处理软件创建、修改和,阅读。由于文本文件存在编码,所以,它也可以被看作是存储在磁盘上的长字符,串,例如一个,txt,格式的文本文件。,文件概述,?文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内,?,二进制文件直接由比特,0,和比特,1,组成,没有统一字符编码,文件内部数据的组,织格式与文件用途有关。二进制是信息按照非字符但特定格式形成的文件,例如,,,png,格式的图片文件、,avi,格式的视频文件。二进制文件和文本文件最主要的区,别在于是否有统一的字符编码。二进制文件由于没有统一字符编码,只能当作字,节流,而不能看作是字符串。,?,无论文件创建为文本文件或者二进制文件,都可以用“文本文件方式”和“二,进制文件方式”打开,但打开后的操作不同。,文件概述,?二进制文件直接由比特0和比特1组成,没有统一字符编码,文件,?,微实例,7.1,:理解文本文件和二进制文件的区别。,?,首先,用文本编辑器生成一个包含“中国是个伟大国家!”的,txt,格式文本文件,,命名为,7.1.txt,。分别用文本文件方式和二进制文件方式读入,并打印输出效果,,代码如下:,文件概述,?微实例7.1:理解文本文件和二进制文件的区别。?首先,用文,?,输出结果为:,?,可以看到,采用文本方式读入文件,文件经过编码形成字符串,打,印出有含义的字符;采用二进制方式打开文件,文件被解析为字节(,byte,)流。由于存在编码,字符串中的一个字符由,2,个字节表示。,文件概述,?输出结果为:?可以看到,采用文本方式读入文件,文件经过编码,?,Python,对文本文件和二进制文件采用统一的操作步骤,即“打开,-,操作,-,关闭”,,如图,7.1,所示。,文件的打开关闭,?Python对文本文件和二进制文件采用统一的操作步骤,即“,?,操作系统中的文件默认处于存储状态,首先需要将其打开,使得当,前程序有权操作这个文件,打开不存在的文件可以创建文件。打开后,的文件处于占用状态,此时,另一个进程不能操作这个文件。可以通,过一组方法读取文件的内容或向文件写入内容,此时,文件作为一个,数据对象存在,采用,.(),方式进行操作。操作之后需要将文件关,闭,关闭将释放对文件的控制使文件恢复存储状态,此时,另一个进,程将能够操作这个文件。,文件的打开关闭,?操作系统中的文件默认处于存储状态,首先需要将其打开,使得当,?,Python,通过解释器内置的,open(),函数打开一个文件,并实现该文件,与一个程序变量的关联,,open(),函数格式如下:,?,=,open(,),?,?,open(),函数有两个参数:文件名和打开模式。文件名可以是文件,的实际名字,也可以是包含完整路径的名字,文件的打开关闭,?Python通过解释器内置的open()函数打开一个文件,,?,打开模式用于控制使用何种方式打开文件,,open(),函数提供,7,种基本,的打开模式,如表,7.1,所示,文件的打开关闭,?打开模式用于控制使用何种方式打开文件,open()函数提供,打开模式使用字符串方式表示,根据字符串定义,单引号或者双引号均可。上述打开模式中,,r,、,w,、,x,、,b,可以和,b,、,t,、,+,组合使用,形成既表达读写又表达文件模式的方式。,例如,,open(),函数默认采用,rt(,文本只读,),模式,读入程序所在目录中,7.1.txt,文件:,textfile,=,open(7.1.txt,r),或,textfile,=,open(7.1.txt),读取一个二进制文件,如一个图片、一段视频或者一段音乐文件,需要使用文件打开模式,rb,。例,如,打开一个名为,music.mp3,的音频文件:,binfile,=,open(music.mp3,rb),文件使用结束后要用,close(),方法关闭,释放文件的使用授权,该方法的使用方式如下:,.close(),文件的打开关闭,打开模式使用字符串方式表示,根据字符串定义,单引号或者双引号,?,当文件被打开后,根据打开方式不同可以对文件进行相应的读写操作。注意,,当文件以文本文件方式打开时,读写按照字符串方式,采用当前计算机上使用的,编码或指定编码;当文件以二进制文件方式打开时,读写按照字节流方式。,?,Python,提供,4,个常用的文件内容读取方法,文件的读写,?当文件被打开后,根据打开方式不同可以对文件进行相应的读写操,?,微实例,7.2,:文本文件逐行打印。,?,用户输入文件路径,以文本文件方式读入文件内容并逐行打印,代码如下:,?,程序首先提示用户输入一个文件名,然后打开文件并赋值给文件对象变量,fo,。,文件的全部内容通过,fo.readlines(),方法读入到一个列表中,列表的每个元素是文件,一行的内容,然后通过,for,in,方式遍历列表,处理每行内容。,文件的读写,?微实例7.2:文本文件逐行打印。?用户输入文件路径,以文本,?,上述代码尽管完成了微实例,7.2,的要求,但存在一些缺点:当读入,文件非常大时,一次性将内容读取到列表中会占用很多内存,影响程,序执行速度。一个合理的方法是逐行读入内容到内存,并逐行处理。,这可以通过一个简单的方法解决。,Python,将文件本身作为一个行序列,,遍历文件的所有行可以直接这样完成,文件的读写,?上述代码尽管完成了微实例7.2的要求,但存在一些缺点:当读,如果程序需要逐行处理文件内容,建议采用上述代码中,2-5,行组成的格式,如下:,fo,=,open(fname,),for,line,in,fo:,#,处理一行数据,fo.close(),文件的读写,如果程序需要逐行处理文件内容,建议采用上述代码中2-5行组成,?,Python,提供,3,个与文件内容写入有关的方法,如表,7.3,所示。,?,微实例,7.3,:向文件写入一个列表。,?,向文件写一个列表类型,并打印输出结果,代码如下:,文件的读写,?Python提供3个与文件内容写入有关的方法,如表7.3所,文件的读写,请输入要写入的文件,:test.txt,文件的读写请输入要写入的文件:test.txt,?,可以看到,程序并没有输出写入的列表内容。在,WriteFileAList1.py,程序同目录,找到,test.txt,文件,打开可以看到其中的内容是:,?,列表,ls,内容被写入文件,但为何,5-7,行代码没有将这些内容打印出来呢?这是因,为文件写入内容后,当前文件操作指针在写入内容的后面,,5-7,行代码从这个,指针开始向后读入并打印内容,被写入的内容却在指针前面,因此未能被打印,出来。为此,可以在写入文件后增加一条代码,fo.seek(0),将文件操作指针返回到,文件开始,即可显示写入的内容,代码如下。,文件的读写,?可以看到,程序并没有输出写入的列表内容。在WriteFil,程序执行结果如下:,文件的读写,程序执行结果如下:文件的读写,PIL,库的使用,PIL库的使用,?,PIL,(,Python Image Library,)库是,Python,语言的第三方库,需要通过,pip,工具安装,,Python,安装第三方库的详细方法请见,8.6,节。安装,PIL,库,的方法如下,需要注意,安装库的名字是,pillow,。,?,PIL,库支持图像存储、显示和处理,它能够处理几乎所有图片格式,,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文,字等操作。,PIL,库概述,?PIL(Python Image Library)库是Py,?,PIL,库主要可以完成图像归档和图像处理两方面功能需求:,?,图像归档:对图像进行批处理、生成图像预览、图像格式转换等;,?,图像处理:图像基本处理、像素处理、颜色处理等。,?,根据功能不同,,PIL,库共包括,21,个与图片相关的类,这些类可以被看作是子库,或,PIL,库中的模块,子库列表如下。,?,Image,、,ImageChops,、,ImageColor,、,ImageCrackCode,、,ImageDraw,、,?,ImageEnhance,、,ImageFile,、,ImageFileIO,、,ImageFilter,、,ImageFont,、,?,ImageGL,、,ImageGrab,、,Imagemath,、,ImageOps,、,ImagePalette,、,ImagePath,、,?,ImageQt,、,ImageSequence,、,ImageStat,、,ImageTk,、,ImageWin,PIL,库概述,?PIL库主要可以完成图像归档和图像处理两方面功能需求:?图,?,在,PIL,中,任何一个图像文件都可以用,Image,对象表示。表,7.4,给出了,Image,类的图像读取和创建方法。,PIL,库,Image,类解析,?在PIL中,任何一个图像文件都可以用Image对象表示。表,?,通过,Image,打开图像文件时,图像的栅格数据不会被直接解码或者,加载,程序只是读取了图像文件头部的元数据信息,这部分信息标识,了图像的格式、颜色、大小等。因此,打开一个文件会十分迅速,与,图像的存储和压缩方式无关。,?,要加载一个图像文件,最简单的形式如下,之后所有操作对,im,起作,用,PIL,库,Image,类解析,?通过Image打开图像文件时,图像的栅格数据不会被直接解码,?,其中,,birdnest.jpg,是一张鸟巢的夜景图像,存储在,D:pycodes,目录中,,如图,7.2,所示。在使用,IDLE,交互方式处理图片文件时,建议采用文,件的全路径;如果使用,Python,文件形式,建议采用相对路径,将文件,和程序放到一个目录中,例如:,PIL,库,Image,类解析,?其中,birdnest.jpg是一张鸟巢的夜景图像,存储在,?,Image,类有,4,个处理图片的常用属性,如表,7.5,所示。,?,?,查看已经读取图像文件的属性如下,PIL,库,Image,类解析,?Image类有4个处理图片的常用属性,如表7.5所示。?,?,Image,还能读取序列类图像文件,包括,GIF,FLI,FLC,TIFF,等格式文件,。,open(),方法打开一个图像时自动加载序列中的第一帧,使用,seek(),和,tell(),方法可以在不同帧之间移动,如表,7.6,所示。,PIL,库,Image,类解析,?Image还能读取序列类图像文件,包括GIF,FLI,FL,?,微实例,7.1,:,GIF,文件图像提取。,?,对一个,GIF,格式动态文件,提取其中各帧图像,并保存为文件。,PIL,库,Image,类解析,?微实例7.1:GIF文件图像提取。?对一个GIF格式动态文,?,微实例,7.1,展示了一种采用,try,except,编写程序的方法,通过,seek(),方法和,save(),方法配合提取,GIF,图像格式的每一帧,并保存为文件。,?,Image,类的图像转换和保存方法如表,7.7,所示。,PIL,库,Image,类解析,?微实例7.1展示了一种采用tryexcept编写程序的方,?,其中,,save(),方法有两个参数:文件名,filename,和图像格式,format,。如果调用时,不指定保存格式,,?,如微实例,7.1,,,PIL,将自动