1、第7章文件和数据格式化第1页文件使用第2页文件是一个存放在辅助存放器上数据序列,能够包含任何数据内容。概念上,文件是数据集合和抽象,类似地,函数是程序集合和抽象。用文件形式组织和表示数据更有效也更为灵活。文件包含两种类型:文本文件和二进制文件。文本文件普通由单一特定编码字符组成,如UTF-8编码,内容轻易统一展示和阅读。大部分文本文件都能够经过文本编辑软件或文字处理软件创建、修改和阅读。因为文本文件存在编码,所以,它也能够被看作是存放在磁盘上长字符串,比如一个txt格式文本文件。文件概述第3页二进制文件直接由比特0和比特1组成,没有统一字符编码,文件内部数据组织格式与文件用途相关。二进制是信息
2、按照非字符但特定格式形成文件,比如,png格式图片文件、avi格式视频文件。二进制文件和文本文件最主要区分在于是否有统一字符编码。二进制文件因为没有统一字符编码,只能看成字节流,而不能看作是字符串。不论文件创建为文本文件或者二进制文件,都能够用“文本文件方式”和“二进制文件方式”打开,但打开后操作不一样。文件概述第4页微实例微实例7.1:了解文本文件和二进制文件区分。:了解文本文件和二进制文件区分。首先,用文本编辑器生成一个包含“中国是个伟大国家!”txt格式文本文件,命名为7.1.txt。分别用文本文件方式和二进制文件方式读入,并打印输出效果,代码以下:文件概述第5页输出结果为:能够看到,采
3、取文本方式读入文件,文件经过编码形成字符串,打印出有含义字符;采取二进制方式打开文件,文件被解析为字节(byte)流。因为存在编码,字符串中一个字符由2个字节表示。文件概述第6页Python对文本文件和二进制文件采取统一操作步骤,即“打开-操作-关闭”,如图7.1所表示。文件打开关闭第7页操作系统中文件默认处于存放状态,首先需要将其打开,使得当前途序有权操作这个文件,打开不存在文件能够创建文件。打开后文件处于占用状态,此时,另一个进程不能操作这个文件。能够经过一组方法读取文件内容或向文件写入内容,此时,文件作为一个数据对象存在,采取.()方式进行操作。操作之后需要将文件关闭,关闭将释放对文件控
4、制使文件恢复存放状态,此时,另一个进程将能够操作这个文件。文件打开关闭第8页Python经过解释器内置open()函数打开一个文件,并实现该文件与一个程序变量关联,open()函数格式以下:=open(,)open()函数有两个参数:文件名和打开模式。文件名能够是文件实际名字,也能够是包含完整路径名字 文件打开关闭第9页 打开模式用于控制使用何种方式打开文件,open()函数提供7种基本打开模式,如表7.1所表示 文件打开关闭打开模式含义r只读模式,假如文件不存在,返回异常FileNotFoundError,默认值w覆盖写模式,文件不存在则创建,存在则完全覆盖源文件x创建写模式,文件不存在则创
5、建,存在则返回异常FileExistsErrora追加写模式,文件不存在则创建,存在则在原文件最终追加内容b二进制文件模式t文本文件模式,默认值+与r/w/x/a一同使用,在原功效基础上增加同时读写功效第10页打开模式使用字符串方式表示,依据字符串定义,单引号或者双引号均可。上述打开模式中,r、w、x、b能够和b、t、+组合使用,形成既表示读写又表示文件模式方式。比如,open()函数默认采取rt(文本只读)模式,读入程序所在目录中7.1.txt文件:textfile=open(7.1.txt,r)或 textfile=open(7.1.txt)读取一个二进制文件,如一个图片、一段视频或者一段
6、音乐文件,需要使用文件打开模式rb。比如,打开一个名为music.mp3音频文件:binfile=open(music.mp3,rb)文件使用结束后要用close()方法关闭,释放文件使用授权,该方法使用方式以下:.close()文件打开关闭第11页 当文件被打开后,依据打开方式不一样能够对文件进行对应读写操作。注意,当文件以文本文件方式打开时,读写按照字符串方式,采取当前计算机上使用编码或指定编码;当文件以二进制文件方式打开时,读写按照字节流方式。Python提供4个惯用文件内容读取方法 文件读写方法含义.readall()读入整个文件内容,返回一个字符串或字节流*.read(size=-1
7、)从文件中读入整个文件内容,假如给出参数,读入前size长度字符串或字节流.readline(size=-1)从文件中读入一行内容,假如给出参数,读入该行前size长度字符串或字节流.readlines(hint=-1)从文件中读入全部行,以每行为元素形成一个列表,假如给出参数,读入hint行第12页微实例微实例7.2:文本文件逐行打印。:文本文件逐行打印。用户输入文件路径,以文本文件方式读入文件内容并逐行打印,代码以下:程序首先提醒用户输入一个文件名,然后打开文件并赋值给文件对象变量fo。文件全部内容经过fo.readlines()方法读入到一个列表中,列表每个元素是文件一行内容,然后经过f
8、orin方式遍历列表,处理每行内容。文件读写第13页 上述代码尽管完成了微实例7.2要求,但存在一些缺点:当读入文件非常大时,一次性将内容读取到列表中会占用很多内存,影响程序执行速度。一个合理方法是逐行读入内容到内存,并逐行处理。这能够经过一个简单方法处理。Python将文件本身作为一个行序列,遍历文件全部行能够直接这么完成 文件读写第14页假如程序需要逐行处理文件内容,提议采取上述代码中2-5行组成格式,以下:fo=open(fname,r)for line in fo:#处理一行数据 fo.close()文件读写第15页Python提供3个与文件内容写入相关方法,如表7.3所表示。微实例微
9、实例7.3:向文件写入一个列表。:向文件写入一个列表。向文件写一个列表类型,并打印输出结果,代码以下:文件读写方法含义.write(s)向文件写入一个字符串或字节流.writelines(lines)将一个元素为字符串列表写入文件.seek(offset)改变当前文件操作指针位置,offset值:0:文件开头;1:当前位置;2:文件结尾第16页文件读写请输入要写入文件:test.txt请输入要写入文件请输入要写入文件:test.txt第17页能够看到,程序并没有输出写入列表内容。在WriteFileAList1.py程序同目录找到test.txt文件,打开能够看到其中内容是:列表ls内容被写入
10、文件,但为何5-7行代码没有将这些内容打印出来呢?这是因为文件写入内容后,当前文件操作指针在写入内容后面,5-7行代码从这个指针开始向后读入并打印内容,被写入内容却在指针前面,所以未能被打印出来。为此,能够在写入文件后增加一条代码fo.seek(0)将文件操作指针返回到文件开始,即可显示写入内容,代码以下。文件读写唐诗宋词元曲第18页程序执行结果以下:文件读写请输入要写入文件:test.txt唐诗宋词元曲第19页PIL库使用第20页PIL(Python Image Library)库是Python语言第三方库,需要经过pip工具安装,Python安装第三方库详细方法请见8.6节。安装PIL库方
11、法以下,需要注意,安装库名字是pillow。PIL库支持图像存放、显示和处理,它能够处理几乎全部图片格式,能够完成对图像缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。PIL库概述:pipinstallpillow#或者或者pip3installpillow第21页PIL库主要能够完成图像归档和图像处理两方面功效需求:图像归档:对图像进行批处理、生成图像预览、图像格式转换等;图像处理:图像基本处理、像素处理、颜色处理等。依据功效不一样,PIL库共包含21个与图片相关类,这些类能够被看作是子库或PIL库中模块,子库列表以下。Image、ImageChops、ImageColor、Image
12、CrackCode、ImageDraw、ImageEnhance、ImageFile、ImageFileIO、ImageFilter、ImageFont、ImageGL、ImageGrab、Imagemath、ImageOps、ImagePalette、ImagePath、ImageQt、ImageSequence、ImageStat、ImageTk、ImageWinPIL库概述第22页在PIL中,任何一个图像文件都能够用Image对象表示。表7.4给出了Image类图像读取和创建方法。PIL库Image类解析方法描述Image.open(filename)依据参数加载图像文件Image.ne
13、w(mode,size,color)依据给定参数创建一个新图像Image.open(StringIO.StringIO(buffer)从字符串中获取图像Image.frombytes(mode,size,data)依据像素点data创建图像Image.verify()对图像文件完整性进行检验,返回异常第23页经过Image打开图像文件时,图像栅格数据不会被直接解码或者加载,程序只是读取了图像文件头部元数据信息,这部分信息标识了图像格式、颜色、大小等。所以,打开一个文件会十分快速,与图像存放和压缩方式无关。要加载一个图像文件,最简单形式以下,之后全部操作对im起作用 PIL库Image类解析第2
14、4页其中,birdnest.jpg是一张鸟巢夜景图像,存放在D:pycodes目录中,如图7.2所表示。在使用IDLE交互方式处理图片文件时,提议采取文件全路径;假如使用Python文件形式,提议采取相对路径,将文件和程序放到一个目录中,比如:PIL库Image类解析第25页Image类有4个处理图片惯用属性,如表7.5所表示。查看已经读取图像文件属性以下 PIL库Image类解析print(im.format,im.size,im.mode)JPEG(900,598)RGB属性描述Image.format标识图像格式或起源,假如图像不是从文件读取,值是NoneImage.mode图像色彩模式
15、,L灰度图像、RGB真彩色图像、CMYK出版图像Image.size图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)Image.palette调色板属性,返回一个ImagePalette类型第26页Image还能读取序列类图像文件,包含GIF,FLI,FLC,TIFF等格式文件。open()方法打开一个图像时自动加载序列中第一帧,使用seek()和tell()方法能够在不一样帧之间移动,如表7.6所表示。PIL库Image类解析方法描述Image.seek(frame)跳转并返回图像中指定帧Image.tell()返回当前帧序号第27页微实例微实例7.1:GIF文件图像提取。
16、文件图像提取。对一个GIF格式动态文件,提取其中各帧图像,并保留为文件。PIL库Image类解析第28页微实例7.1展示了一个采取tryexcept编写程序方法,经过seek()方法和save()方法配合提取GIF图像格式每一帧,并保留为文件。Image类图像转换和保留方法如表7.7所表示。PIL库Image类解析方法描述Image.save(filename,format)将图像保留为filename文件名,format是图片格式Image.convert(mode)使用不一样参数,转换图像为新模式Image.thumbnail(size)创建图像缩略图,size是缩略图尺寸二元元组第29页
17、 其中,save()方法有两个参数:文件名filename和图像格式format。假如调用时不指定保留格式,如微实例7.1,PIL将自动依据文件名filename后缀存放图像;假如指定格式,则按照格式存放。搭配采取open()和save()方法能够实现图像格式转换,比如,将png格式转换为jpg格式,代码以下。需要注意,Image类save()方法主要用于保留文件到硬盘,PIL库还提供了功效更强格式转换方法 PIL库Image类解析12im=Image.open(birdnest.jpg)im.save(birdnest.png)第30页生成birdnest.jpg图像缩略图,代码以下(续上一
18、个IDLE指令),鸟巢图片及其缩略图如图7.2所表示。其中(128,128)是缩略图尺寸。PIL库Image类解析im.thumbnail(128,128)im.save(birdnestTN,JPEG)北京鸟巢图片及其缩略图第31页Image类能够缩放和旋转图像,方法如表7.8所表示,其中,rotate()方法以逆时针旋转角度值作为参数来旋转图像。PIL库Image类解析方法描述Image.resize(size)按size大小调整图像,生成副本Image.rotate(angle)按angle角度旋转图像,生成副本第32页Image类能够对每个像素点或者一幅RGB图像每个通道单独进行操作,
19、如表7.9所表示。split()方法能够将RGB图像各颜色通道提取出来,merge()方法能够将各独立通道再合成一幅新图像。PIL库Image类解析方法描述Image.point(func)依据函数func功效对每个元素进行运算,返回图像副本Image.split()提取RGB图像每个颜色通道,返回图像副本Image.merge(mode,bands)合并通道,采取mode色彩,bands是新色色彩通道Image.blend(im1,im2,alpha)将两幅图片im1和im2按照以下公式插值后生成新图像:im1*(1.0-alpha)+im2*alpha第33页微实例微实例7.2:图像颜色交
20、换。:图像颜色交换。交换图像中颜色。能够经过分离RGB图片三个颜色通道实现颜色交换。代码以下,程序执行效果如图7.3所表示,夜色下北京鸟巢变成了蓝色!PIL库Image类解析第34页PIL库Image类解析被改变颜色北京鸟巢图片被改变颜色北京鸟巢图片第35页 操作图像每个像素点需要经过函数实现,采取lambda函数和point()方法搭配使用,例子以下,显示效果如图7.4所表示 PIL库Image类解析第36页PIL库Image类解析去掉光线北京鸟巢图片第37页PIL库ImageFilter类和ImageEnhance类提供了过滤和增强方法。ImageFilter类共提供10种预定义图像过滤方
21、法,如表7.10所表示。图像过滤和增强方法表示描述ImageFilter.BLUR图像含糊效果ImageFilter.CONTOUR图像轮廓效果ImageFilter.DETAIL图像细节效果ImageFilter.EDGE_ENHANCE图像边界加强效果ImageFilter.EDGE_ENHANCE_MORE图像阈值边界加强效果ImageFilter.EMBOSS图像浮雕效果ImageFilter.FIND_EDGES图像边界效果ImageFilter.SMOOTH图像平滑效果ImageFilter.SMOOTH_MORE图像阈值平滑效果ImageFilter.SHARPEN图像锐化效果第
22、38页利用Image类filter()方法能够使用ImageFilter类,使用方式以下:Image.filter(ImageFilter.fuction)微实例微实例7.3:图像轮廓获取。:图像轮廓获取。获取图像轮廓,代码以下,程序执行效果如图7.5所表示,北京鸟巢变得愈加抽象、更具想象空间!图像过滤和增强第39页图像过滤和增强北京鸟巢图片轮廓效果北京鸟巢图片轮廓效果第40页ImageEnhance类提供了更高级图像增强需求,它提供调整色彩度、亮度、对比度、锐化等功效,如表7.11所表示。图像过滤和增强方法描述ImageEnhance.enhance(factor)对选择属性数值增强factor倍ImageEnhance.Color(im)调整图像颜色平衡ImageEnhance.Contrast(im)调整图像对比度ImageEnhance.Brightness(im)调整图像亮度ImageEnhance.Sharpness(im)调整图像锐度第41页微实例微实例7.4:图像对比度增强。:图像对比度增强。增强图像对比度为初始20倍。代码以下,程序执行效果如图7.6所表示。图像过滤和增强第42页图像过滤和增强北京鸟巢图片北京鸟巢图片20倍对比度增强效果倍对比度增强效果第43页