1、Python语言程序设计第7章 文件和数据格式化文件的使用数据源文件概述文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象,类似地,函数是程序的集合和抽象。用文件形式组织和表达数据更有效也更为灵活。文件包括两种类型:文本文件和二进制文件。文件概述二进制文件直接由比特0和比特1组成,没有统一字符编码,文件内部数据的组织格式与文件用途有关。二进制文件和文本文件最主要的区别在于是否有统一的字符编码无论文件创建为文本文件或者二进制文件,都可以用“文本文件方式”和“二进制文件方式”打开,打开后的操作不同。文件概述微实例微实例7.1:理解文本文件和二进制文件的区别
2、。:理解文本文件和二进制文件的区别。微实例7.1m7.1DiffTextBin.py 123456textFile=open(7.1.txt,rt)#t表示文本文件方式表示文本文件方式print(textFile.readline()textFile.close()binFile=open(7-1.txt,rb)#r表示二进制文件方式表示二进制文件方式print(binFile.readline()binFile.close()文件概述输出结果为:中国是个伟大的国家!bxd6xd0 xb9xfaxcaxc7xb8xf6xcexb0 xb4xf3xb5xc4xb9xfaxbcxd2xa3xa1采
3、用文本方式读入文件,文件经过编码形成字符串,打印出有含义的字符;采用二进制方式打开文件,文件被解析为字节(byte)流。由于存在编码,字符串中的一个字符由2个字节表示。文件的打开关闭Python对文本文件和二进制文件采用统一的操作步骤,即“打开-操作-关闭”文件的打开关闭Python通过解释器内置的open()函数打开一个文件,并实现该文件与一个程序变量的关联,open()函数格式如下:=open(,)open()函数有两个参数:文件名和打开模式。文件名可以是文件的实际名字,也可以是包含完整路径的名字 文件的打开关闭open()函数提供7种基本的打开模式打开模式含义r只读模式,如果文件不存在,
4、返回异常FileNotFoundError,默认值w覆盖写模式,文件不存在则创建,存在则完全覆盖源文件x创建写模式,文件不存在则创建,存在则返回异常FileExistsErrora追加写模式,文件不存在则创建,存在则在原文件最后追加内容b二进制文件模式t文本文件模式,默认值+与r/w/x/a一同使用,在原功能基础上增加同时读写功能文件的读写根据打开方式不同可以对文件进行相应的读写操作,Python提供4个常用的文件内容读取方法 方法含义.readall()读入整个文件内容,返回一个字符串或字节流*.read(size=-1)从文件中读入整个文件内容,如果给出参数,读入前size长度的字符串或字
5、节流.readline(size=-1)从文件中读入一行内容,如果给出参数,读入该行前size长度的字符串或字节流.readlines(hint=-1)从文件中读入所有行,以每行为元素形成一个列表,如果给出参数,读入hint行文件的读写微实例微实例7.2:文本文件逐行打印:文本文件逐行打印微实例7.2m7.2PrintFilebyLines.py 12345fname=input(请输入要打开的文件请输入要打开的文件:)fo=open(fname,r)forlineinfo.readlines():print(line)fo.close()文件的读写遍历文件的所有行可以直接这样完成 12345
6、fname=input(请输入要打开的文件请输入要打开的文件:)fo=open(fname,r)forlineinfo:print(line)fo.close()文件的读写如果程序需要逐行处理文件内容,建议采用上述代码格式:fo=open(fname,r)for line in fo:#处理一行数据fo.close()文件的读写Python提供3个与文件内容写入有关的方法,如表所示。方法含义.write(s)向文件写入一个字符串或字节流.writelines(lines)将一个元素为字符串的列表写入文件.seek(offset)改变当前文件操作指针的位置,offset的值:0:文件开头;1:当
7、前位置;2:文件结尾文件的读写微实例7.3m7.3WriteListtoFile.py 1234567fname=input(请输入要写入的文件请输入要写入的文件:)fo=open(fname,w+)ls=唐诗唐诗,宋词宋词,元曲元曲fo.writelines(ls)forlineinfo:print(line)fo.close()程序执行结果如下:请输入要写入的文件请输入要写入的文件:test.txtPIL库的使用PIL库概述PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装。:pipinstallpillow#或者或者pip3insta
8、llpillowPIL库支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。PIL库概述PIL库可以完成图像归档和图像处理两方面功能需求:图像归档:对图像进行批处理、生成图像预览、图像格式转换等;图像处理:图像基本处理、像素处理、颜色处理等。PIL库Image类解析在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法。方法描述Image.open(filename)根据参数加载图像文件Image.new(mode,size,color)根据给定参数创建一个新的图像Image.open(St
9、ringIO.StringIO(buffer)从字符串中获取图像Image.frombytes(mode,size,data)根据像素点data创建图像Image.verify()对图像文件完整性进行检查,返回异常PIL库Image类解析要加载一个图像文件,最简单的形式如下,之后所有操作对im起作用 fromPILimportImageim=Image.open(D:pycodesbirdnest.jpg)PIL库Image类解析Image类有4个处理图片的常用属性 属性描述Image.format标识图像格式或来源,如果图像不是从文件读取,值是NoneImage.mode图像的色彩模式,L灰
10、度图像、RGB真彩色图像、CMYK出版图像Image.size图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)Image.palette调色板属性,返回一个ImagePalette类型PIL库Image类解析微实例7.1:GIF文件图像提取。对一个GIF格式动态文件,提取其中各帧图像,并保存为文件。微实例7.1m7.1GifExtractor.py 123456789fromPILimportImageim=Image.open(pybit.gif)#读入一个读入一个GIF文件文件try:im.save(picframe:02d.png.format(im.tell()whi
11、leTrue:im.seek(im.tell()+1)im.save(picframe:02d.png.format(im.tell()except:print(处理结束处理结束)PIL库Image类解析Image类的图像转换和保存方法如表所示。方法描述Image.save(filename,format)将图像保存为filename文件名,format是图片格式Image.convert(mode)使用不同的参数,转换图像为新的模式Image.thumbnail(size)创建图像的缩略图,size是缩略图尺寸的二元元组PIL库Image类解析生成birdnest.jpg图像的缩略图,其中(
12、128,128)是缩略图的尺寸。im.thumbnail(128,128)im.save(birdnestTN,JPEG)北京鸟巢图片及其缩略图PIL库Image类解析Image类可以缩放和旋转图像,其中,rotate()方法以逆时针旋转的角度值作为参数来旋转图像。方法描述Image.resize(size)按size大小调整图像,生成副本Image.rotate(angle)按angle角度旋转图像,生成副本PIL库Image类解析Image类能够对每个像素点或者一幅RGB图像的每个通道单独进行操作,split()方法能够将RGB图像各颜色通道提取出来,merge()方法能够将各独立通道再合
13、成一幅新的图像。方法描述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*alphaPIL库Image类解析微实例微实例7.2:图像的颜色交换。:图像的颜色交换。交换图像中的颜色。可以通过分离RGB图片的三个颜色通道实现颜色交换微实例7.2m7.1
14、ChangeRGB.py 12345fromPILimportImageim=Image.open(birdnest.jpg)r,g,b=im.split()om=Image.merge(RGB,(b,g,r)om.save(birdnestBGR.jpg)PIL库Image类解析被改变颜色的北京鸟巢图片被改变颜色的北京鸟巢图片 PIL库Image类解析 操作图像的每个像素点需要通过函数实现,采用lambda函数和point()方法搭配使用,例子如下im=Image.open(D:pycodesbirdnest.jpg)#打开鸟巢文件打开鸟巢文件r,g,b=im.split()#获得获得RGB
15、通道数据通道数据newg=g.point(lambdai:i*0.9)#将将G通道颜色值变为原来的通道颜色值变为原来的0.9倍倍newb=b.point(lambdai:iom=Image.merge(im.mode,(r,newg,newb)#将将3个通道合形成新图像个通道合形成新图像om.save(D:pycodesbirdnestMerge.jpg)#输出图片输出图片PIL库Image类解析去掉光线的北京鸟巢图片 图像的过滤和增强PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法,共10种方法表示描述ImageFilter.BLUR图像的模糊效果
16、ImageFilter.CONTOUR图像的轮廓效果ImageFilter.DETAIL图像的细节效果ImageFilter.EDGE_ENHANCE图像的边界加强效果ImageFilter.EDGE_ENHANCE_MORE图像的阈值边界加强效果ImageFilter.EMBOSS图像的浮雕效果ImageFilter.FIND_EDGES图像的边界效果ImageFilter.SMOOTH图像的平滑效果ImageFilter.SMOOTH_MORE图像的阈值平滑效果ImageFilter.SHARPEN图像的锐化效果图像的过滤和增强利用Image类的filter()方法可以使用ImageFil
17、ter类,如下:Image.filter(ImageFilter.fuction)微实例7.3:图像的轮廓获取。获取图像的轮廓,北京鸟巢变得更加抽象、更具想象空间!图像的过滤和增强微实例7.3m7.3GetImageContour.py 12345fromPILimportImagefromPILimportImageFilterim=Image.open(birdnest.jpg)om=im.filter(ImageFilter.CONTOUR)om.save(birdnestContour.jpg)北京鸟巢图片的轮廓效果北京鸟巢图片的轮廓效果 图像的过滤和增强ImageEnhance类提供
18、了更高级的图像增强需求,它提供调整色彩度、亮度、对比度、锐化等功能。方法描述ImageEnhance.enhance(factor)对选择属性的数值增强factor倍ImageEnhance.Color(im)调整图像的颜色平衡ImageEnhance.Contrast(im)调整图像的对比度ImageEnhance.Brightness(im)调整图像的亮度ImageEnhance.Sharpness(im)调整图像的锐度图像的过滤和增强微实例7.4:图像的对比度增强。增强图像的对比度为初始的20倍。微实例7.4m7.4EnImageContrast.py 12345fromPILimpor
19、tImagefromPILimportImageEnhanceim=Image.open(birdnest.jpg)om=ImageEnhance.Contrast(im)om.enhance(20).save(birdnestEnContrast.jpg)图像的过滤和增强北京鸟巢图片的20倍对比度增强效果 图像字符画绘制图像字符画绘制位图图片是由不同颜色像素点组成的规则分布,如果采用字符串代替像素,图像就成为了字符画。定义一个字符集,将这个字符集替代图像中的像素点。12ascii_char=list($B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjf12345687
20、95t/|()1?-_+i!;:,.)图像字符画绘制123456defget_char(r,b,g,alpha=256):ifalpha=0:returngray=int(0.2126*r+0.7152*g+0.0722*b)unit=256/len(ascii_char)returnascii_chargray/unit定义彩色向灰度的转换公式如下,其中R、G、B分别是像素点的RGB颜色值:Gray=R*0.2126+G*0.7152+B*0.0722因此,像素的RGB颜色值与字符集的对应函数如下:实例代码12.1e12.DrawCharImage.py 123456789101112131
21、41516171819202122#e12.1DrawCharImage.py.pyfromPILimportImageascii_char=list($%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1?-/+i!;:,.)defget_char(r,b,g,alpha=256):ifalpha=0:returngray=int(0.2126*r+0.7152*g+0.0722*b)unit=256/len(ascii_char)returnascii_charint(gray/unit)defmain():im=Image.open(pic.jpg)WID
22、TH,HEIGHT=100,60im=im.resize(WIDTH,HEIGHT)txt=foriinrange(HEIGHT):forjinrange(WIDTH):txt+=get_char(*im.getpixel(j,i)txt+=nfo=open(pic_char.txt,w)fo.write(txt)fo.close()main()图像字符画绘制一二维数据格式化和处理数据组织的维度一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中的数组和集合等概念。中国、美国、日本、德国、法国、英国、意大利、加拿大、俄罗斯、欧盟、澳大利亚、南非、阿根廷、巴西、印度、印度尼西亚
23、、墨西哥、沙特阿拉伯、土耳其、韩国数据组织的维度二维数据,也称表格数据,由关联关系数据构成,采用表格方式组织,对应于数学中的矩阵,常见的表格都属于二维数据。城市环比同比定基北京101.5120.7121.4上海101.2127.3127.8广州101.3119.4120.0深圳102.0140.9145.5沈阳100.1101.4101.6环比:上月=100;同比:上年同月=100;定基:2015年=100。数据组织的维度 高维数据由键值对类型的数据构成,采用对象方式组织,属于整合度更好的数据组织方式。高维数据在网络系统中十分常用,HTML、XML、JSON等都是高维数据组织的语法结构。数据组
24、织的维度本书作者:姓氏:嵩,名字:天,单位:北京理工大学 ,姓氏:礼,名字:欣,单位:北京理工大学 ,姓氏:黄,名字:天羽,单位:北京理工大学 一二维数据的存储格式一维数据是最简单的数据组织类型,有多种存储格式,常用特殊字符分隔:(1)用一个或多个空格分隔,例如:中国 美国 日本 德国 法国 英国 意大利(2)用逗号分隔,例如:中国,美国,日本,德国,法国,英国,意大利(3)用其他符号或符号组合分隔,建议采用不出现在数据中的特殊符号中国;美国;日本;德国;法国;英国;意大利一二维数据的存储格式逗号分割数值的存储格式叫做CSV格式(Comma-Separated Values,即逗号分隔值),它
25、是一种通用的、相对简单的文件格式,在商业和科学上广泛应用,尤其应用在程序之间转移表格数据。一二维数据的存储格式该格式的应用有一些基本规则,如下:(1)纯文本格式,通过单一编码表示字符;(2)以行为单位,开头不留空行,行之间没有空行;(3)每行表示一个一维数据,多行表示二维数据;(4)以逗号分隔每列数据,列数据为空也要保留逗号;(5)可以包含或不包含列名,包含时列名放置在文件第一行。一二维数据的存储格式 二维数据采用CSV存储后的内容如下:城市,环比,同比,定基北京,101.5,120.7,121.4上海,101.2,127.3,127.8广州,101.3,119.4,120深圳,102,140
26、.9,145.5沈阳,100.1,101.4,101.6CSV格式存储的文件一般采用.csv为扩展名,可以通过Windows平台上的记事本或微软Office Excel工具打开,也可以在其他操作系统平台上用文本编辑工具打开。一二维数据的表示和读写CSV文件的每一行是一维数据,可以使用Python中的列表类型表示,整个CSV文件是一个二维数据,由表示每一行的列表类型作为元素,组成一个二维列表。城市,环比,同比,定基n,北京,101.5,120.7,121.4n,上海,101.2,127.3,127.8n,广州,101.3,119.4,120.0n,深圳,102.0,140.9,145.5n,沈阳
27、,100.1,101.4,101.6n,一二维数据的表示和读写需要注意,以split(,)方法从CSV文件中获得内容时,每行最后一个元素后面包含了一个换行符(n)。对于数据的表达和使用来说,这个换行符是多余的,可以通过使用字符串的replace()方法将其去掉,如第4行。一二维数据的表示和读写微实例微实例7.6:逐行处理:逐行处理CSV格式数据。格式数据。微实例7.6m7.6GetCSVbyLine.py 12345678910fo=open(price2016.csv,r)ls=forlineinfo:line=line.replace(n,)ls=line.line.split(,)lns
28、=forsinls:lns+=t.format(s)print(lns)fo.close()一二维数据的表示和读写运行后的输出结果如下:城市环比同比定基北京101.5120.7121.4上海101.2127.3127.8广州101.3119.4120.0深圳102.0140.9145.5沈阳100.1101.4101.6一二维数据的表示和读写 微实例微实例7.7:一维数据写入:一维数据写入CSV文件。文件。微实例7.7m7.7WriteD1toCSV.py 1234fo=open(price2016bj.csv,w)ls=北京北京,101.5,120.7,121.4fo.write(,.joi
29、n(ls)+n)fo.close()一二维数据的表示和读写对于列表中存储的二维数据,可以通过循环写入一维数据的方式写入CSV文件,参考代码样式如下:for row in ls:.write(,.join(row)+n)一二维数据的表示和读写微实例微实例7.8:二维数据写入:二维数据写入CSV文件。文件。城市,环比,同比,定基北京,1.0%,1.2%,1.2%上海,1.0%,1.3%,1.3%广州,1.0%,1.2%,1.2%深圳,1.0%,1.4%,1.5%沈阳,1.0%,1.0%,1.0%一二维数据的表示和读写微实例7.8m7.8WriteD2toCSV.py 123456789101112
30、131415fr=open(price2016.csv,r)fw=open(price2016out.csv,w)ls=forlineinfr:#将将CSV文件中的二维数据读入到列表变量文件中的二维数据读入到列表变量line=line.replace(n,)ls.append(line.split(,)foriinrange(len(ls):#遍历列表变量计算百分数遍历列表变量计算百分数forjinrange(len(lsi):iflsij.replace(.,).isnumeric():lsij=:.2%.format(float(lsij)/100)forrowinls:#将列表变量中的二
31、位数据输出到将列表变量中的二位数据输出到CSV文件文件print(row)fw.write(,.join(row)+n)fr.close()fw.close()CSV格式的HTML展示CSV格式的HTML展示文件名:CSV2HTML.html 12345678910111213141516171819202016年7月部分大中城市新建住宅价格指数城市环比同比定基北京101.5120.7121.4上海101.2127.3127.8广州101.3119.4120.0深圳102.0140.9145.5沈阳100.1101.4101.6CSV格式的HTML展示实例代码13.1e13.1csv2html
32、.py 123456789101112131415#e13.1csv2html.pyseg1=nnn2016年年7月部分大中城市新建住宅价格指数月部分大中城市新建住宅价格指数nseg2=nseg3=nndeffill_data(locls):seg=n.format(*locls)returnsegfr=open(price2016.csv,r)ls=CSV格式的HTML展示实例代码13.1e13.1csv2html.py 1617181920212223242526272829forlineinfr:line=line.replace(n,)ls.append(line.split(,)fr
33、.close()fw=open(price2016.html,w)fw.write(seg1)fw.write(nnnn.format(*ls0)fw.write(seg2)foriinrange(len(ls)-1):fw.write(fill_data(lsi+1)fw.write(seg3)fw.close()高维数据的格式化高维数据的格式化与一维二维数据不同,高维数据能展示数据间更为复杂的组织关系。为了保持灵活性,表示高维数据不采用任何结构形式,仅采用最基本的二元关系,即键值对。万维网是高维数据最成功的典型应用。JSON格式可以对高维数据进行表达和存储。JSON(JavaScript
34、Object Notation)是一种轻量级的数据交换格式,易于阅读和理解。JSON格式表达键值对的基本格式如下,键值对都保存在双引号中:key:value高维数据的格式化当多个键值对放在一起时,JSON有如下一些约定:数据保存在键值对中;键值对之间由逗号分隔;括号用于保存键值对数据组成的对象;方括号用于保存键值对数据组成的数组。以“本书作者”JSON数据为例。Json格式高维数据的格式化本书作者:姓氏:嵩,名字:天,单位:北京理工大学 ,姓氏:礼,名字:欣,单位:北京理工大学 ,姓氏:黄,名字:天羽,单位:北京理工大学 json库的使用Json库的概述n json库主要包括两类函数:操作类函
35、数和解析类函数 操作类函数主要完成外部JSON格式和程序内部数据类型之间的转换功能 解析类函数主要用于解析键值对内容。Json库的解析函数描述json.dumps(obj,sort_keys=False,indent=None)将Python的数据类型转换为JSON格式,编码过程json.loads(string)将JSON格式字符串转换为Python的数据类型,解码过程json.dump(obj,fp,sort_keys=False,indent=None)与dumps()功能一致,输出到文件fpjson.load(fp)与loads()功能一致,从文件fp读入dumps()和loads()
36、分别对应编码和解码功能。Json库的解析dt=b:2,c:4,a:6s1=json.dumps(dt)#dumps返回返回JSON格式的字符串类型格式的字符串类型s2=json.dumps(dt,sort_keys=True,indent=4)print(s1)c:4,a:6,b:2print(s2)a:6,b:2,c:4print(s1=s2)Falsedt2=json.loads(s2)print(dt2,type(dt2)c:4,a:6,b:2CSV和JSON格式相互转换CSV和JSON格式相互转换CSV格式常用于一二维数据表示和存储,JSON也可以表示一二维数据。在网络信息传输中,可能
37、需要统一表示方式,因此,需要在CSV和JSON格式间进行相互转换。同比:120.7,城市:北京,定基:121.4,环比:101.5CSV和JSON格式相互转换将CSV转换成JSON格式的代码如下 实例代码14.1e14.1csv2json.py 12345678910111213#e14.1csv2json.pyimportjsonfr=open(price2016.csv,r)ls=forlineinfr:line=line.replace(n,)ls.append(line.split(,)fr.close()fw=open(price2016.json,w)foriinrange(1,l
38、en(ls):lsi=dict(zip(ls0,lsi)json.dump(ls1:,fw,sort_keys=True,indent=4)fw.close()同比:120.7,城市:北京,定基:121.4,环比:101.5,同比:127.3,城市:上海,定基:127.8,环比:101.2,同比:119.4,城市:广州,定基:120,环比:101.3,同比:140.9,城市:深圳,定基:145.5,环比:102,同比:101.4,城市:沈阳,定基:101.6,环比:100.1,同比:,城市:,定基:,环比:将二维JSON格式数据转换成CSV格式的代码如下,供参考。实例代码14.2e14.2js
39、on2csv.py 123456789101112#14.2json2csv.pyimportjsonfr=open(price2016.json,r)ls=json.load(fr)data=list(ls0.keys()foriteminls:data.append(list(item.values()fr.close()fw=open(price2016_from_json.csv,w)foritemindata:fw.write(,.join(item)+n)fw.close()1.巧用名言,亮出论点。作者引用贴切的名言,巧妙地提出中心论点,言简意赅,简明易懂,便于读者把握主旨。2.古
40、今对举,例证典型。为了让论点得以有力的凸显,文章采用古今中外的名人名言与事例作为论据,纵横捭阖,让人心服口服,不容置疑。3.句式多变,感情充沛。行文中,作者多处使用了设问句、反问句和感叹句,分别起到了不同的表达作用,字里行间洋溢着作者的立场、观点与情感,增强了语言的表现力与论证色彩和力度。4娜塔莎失望和狂喜都有所准备的焦急的面色,忽然明朗起来,露出了快乐、感激、小孩般的笑容。5对于自己的专业精通又专注几乎就是自己对生命最好的馈赠,因为不仅它能让自己得到更多机会,而且能为这世界创造更多价值,这或许就是生命意义所在。6小说中的娜塔莎是托尔斯泰笔下的一个经典形象,她出身于贵族家庭,是一个充满浪漫与幻想且多愁善感的女性。7.推行自主招生改革,扩大学校的招生自主权,有助于高校根据自己的办学定位、育人要求,选拔适合本校培养目标的学生。