第七章文件与数格式化

第七章文件与数格式化

7.1文件的使用

7.1.1 文件概述

1.文件概述

文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容,文件是数据的集合和抽象,用文件形式组织和表达数据更有效也更为灵活

2.文件类型

文本文件(有统一的字符编码)

  • 文本文件一般由单一特定编码的字符组成,如UTF-8编码,内容容易统一展 示和阅读

二进制文件(无统一的字符编码)

​ 二进制文件直接由比特0和比特1组成,没有统一字符编码,文件内部数据的组织格式与文件用途有关,只能当做字节流,不能看作字符串

  • 无论文件创建为文本文件或者二进制文件,都可以用“文本文件方式”和“二进制文件方式”打开,打开后的操作不同。
  • 实例textFile=open(“7.1.txt”,“rt”)#表示文本文件方式

​ binFile=open(“7.1.txt”,“rb”)#表示二进制文件方式

采用文本方式读入(从外存读入到内存)文件,文件经过编码(如UTF-8)形成字符串,打印出有含义的字符。

采用二进制方式打开文件,文件被解析为字节(byte)流

由于存在编码,字符串中的一个字符由两个字节表示

7.1.2文件的打开关闭

1.open()函数

python通过解释器内置的open()函数打开一个文件,并实现该文件与一个程序变量(文件变量)的关联,open()格式:<变量名>=open(<文件名>,<打开方式>)

2.文件名的获取方式

  • (1)文件路径和名称: “D:/PYE/f.txt”

  • (2)源文件同目录可省略路径:“f.txt”

  • (3)open()函数提供7种基本的打开模式

打开模式 含义
‘r’ 只读模式,如果文件不存在返回异常FileNotDoundError,默认值
‘w’ 覆盖写模式,文件不存在则创建,存在则完全覆盖文源文件
‘x’ 创建写模式,文件不存在则创建,存在则返回议程FileExistsError
‘a’ 追加写模式,文件不存在则创建,存在则在原文件最后追加内容
‘b’ 二进制文件模式
‘t’ 文本文件模式,默认值
‘+’ 与r/w/x/a一同使用,在原功能基础上增加同时读写功能

(4)Python提供的四个常用的文件内容读取方法

方法 含义
.readall() 读入整个文件内容,返回一个字符串或字节流
.read(size=-1) 从文件中读入整个文件内容,如果给出参数, 读入前size个字节长度的字符串或字节流
.readline(size=-1) 从文件中读入一行内容,如果给出参数,读入 该行前size个字节长度的字符串或字节流
.readlines(hint=-1) 从文件中读入所有行,以每行为元素形成一个 列表,如果给出参数,读入hint行

(5)python提供3个文件内容写入有关的方法,如图所示。

方法 含义
.write(s) 向文件写一个字符串或字节流
.writelines(lines) 将一个元素为字符串的列表写入文件
.seek(offset) 改变当前文件操作指针的位置,offset的值: 0:文件开头;1:当前位置;2:文件结尾

7.2PIL库的使用

7.2.1PIL概述

  • PIL(python image library)库是python语言的第三方库,需要通过pip工具安装。pip install pillow

  • PIL库支持图像存储、显示和处理,他能过处理几乎所有图片格式,可以完成对图像的缩放、裁剪、叠加以及向图像添加线条、图像和文字等操作。

  • PIL库可以完成图像归档和图像处理两方面功能需求。

    • 图像归档:对图像进行批处理、生成图像预览、图像格式转换等;
    • 图像处理:图像基本处理、像素处理、颜色处理等。

7.2.2PIL库image类解析

1.PIL库的独享读取和创建方法:

方法 描述
Image.open(filename) 根据参数加载图像内容
Image.new(mode,size,color) 根据给定参数创建一个新的图像
Image.open(StringIO.StringIO(buffer)) 从字符串中获取图像
Image.frombytes(mode,size,data) 根据像素点data创建图像
Image.verify() 对图像文件完整性进行检查,返回异常

2.PIL库包含了21个与图片相关的类,可以看作是子库或PIL库中的模板:

    • Image:Image模板是在Python PIL图像处理中最常见的模板,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。
    • Imagechops:模块包含一些算数图形操作,叫做channel operation(“chops”)。这些操作可用于诸多目的,比如图像特效,图像组合,算法绘图等等。
    • ImageColor:包括颜色表格和从CSS3样式颜色转化为RGB元组的转换器。除了别的,这个模块多用于Image.new函数和ImageDraw模块。
    • ImageCrackcode:允许用户检测和测量图像的各种性质。这个模块只存在于PIL Plus包中。
    • ImageDraw:为image对象提供了基本的图形处理功能。例如,他可以创建新图像,注释或润饰已存在的图像,为web应用实时产生各种图形。

3.Image类有四个处理图片的常用属性

属性 描述
Image.format 标识图像格式或来源,如果图像不是从文件读取,值是None
Image.mode 图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、“CMYK” 出版图像(CMYK指的是印刷四色模式)
Image.size 图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)
Image.palette 调色板属性,返回一个ImagePalette类型

4.Image类的图像转换和保存方法如表所示:

方法 描述
Image.save(filename.format) 将图像保存为filename文件名,format是图片的格式
Image.convert(mode) 使用不同的参数,转换图像为新的模式
Image.thumbnail(size) 创建图像的缩略图,size是缩略图尺寸的二元元组

5.Image类可以缩放和旋转图像:

方法 描述
Image.resize(size) 按size大小调整图像,生成副本
Image.rotate(angle) 按angle角度逆时针旋转图像,生成副本

6.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
Image.seek(frame) 在给定的文件序列中查找指定的帧。如果超越了末尾则产生一个EOFError的异常,当文件被打开时,PIL库自动指定到第0帧上。
Image.tell() 返回当前帧所处位置,从0开始计算。

7.实例通过分离RGB图片的三个颜色通道实现颜色交换。

from PIL import Image

im = Image.open(‘birdnest.jpg’)

r,g,b=im.split()

om=Image.merge(“RGB”,(b,g,r))

om.save(‘birdnestBGR.jpg’)

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8D1Pg81L-1588945271105)(C:\Users\60917\AppData\Roaming\Typora\typora-user-images\1588746040015.png)]

8.操作图像的每个像素点需要通过函数实现,采用lambda函数和point()方法搭配使用

>>> from PIL import Image

>>> im = Image.open(‘F:\学习\大二下\python\代码\birdnest.jpg’)

>>> r,g,b=im.split()

>>> newg = g.point(lambda i:i*0.9)

>>> newb = b.point(lambda i:i<100)

>>> om = Image.merge(im.mode,(r,newg,newb))

>>> om.save(‘F:\学习\大二下\python\代码\birdnestMerge.jpg’)

结果展示:(去掉发射光线)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRa1yiTd-1588945271114)(C:\Users\60917\AppData\Roaming\Typora\typora-user-images\1588746111307.png)]

7.2.3图像的过滤和增强

方法表示 描述
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 图像的锐化效果(衔接处的悬崖)

利用Image类的filter()方法可以使用ImageFilter类,如下:Image.filter(ImageFilter.function)

1.微实例7.5-2图像的轮廓获取。

from PIL import Image
from PIL import ImageFilter
im = Image.open(‘birdnest.jpg’)
om=im.filter(ImageFilter.CONTOUR)
om.save(‘birdnestContour.jpg’)

处理结果:

image-20200429204440562

2.ImageEnhance类提供了更高级的图像增强需求,他提供调整色彩度、亮度、对比度、锐化等功能

方法 描述
ImageEnhance.enhance(factor) 对选择属性的数值增强factor倍
ImageEnhance.Color(im) 调整图像的颜色平衡
ImageEnhance.Contrast(im) 调整图像对比度(黑点比白点,越大渐变)
ImageEnhance.Brightness(im) 调整图像的亮度
ImageEnhance.Sharpness(im) 调整图像的锐度

3.微实例7.5-3图像的对比度增强

from PIL import Image
from PIL import ImageEnhance
im=Image.open(‘birdnest.jpg’)
om=ImageEnhance.Contrast(im)
om.enhance(20).save(‘birdnestEnConterast.jpg’)

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ej5qp0Q4-1588945271118)(C:\Users\60917\AppData\Roaming\Typora\typora-user-images\image-20200429205639671.png)]

7.3图像字符画绘制

7.3.1图像字符画绘制

位图图片是由不同颜色像素点组成的规则分布,如果采用字符串代替像素,图像就成为了字符画。

  • 定义一个字符集,将这个字符集替代图像中的像素点。
  • 定义彩色向灰度的转换公式如下,其中R、G、B分别是像素点的RGB颜色值:Gray = R0.2126+G0.7152+B*0.0722

7.4一二维数据格式化和处理

7.4.1数据组织的维度

  • 一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中的数组和集合等概念
  • 二维数据,也称为表格数据,有管理关系数据构成,采用表格方式组织对应于数学中的矩阵,常见的表格都属于二维数据。
  • 高维数据由键值对类型的数据构成,采用对象方式组织,属于整合度更好的数据组织方式。
  • 高维数据在网络系统中十分常用,HTML、XML、JSON等都是高维数据组织的语法结构。
    例子:“本书作者”:[{“姓氏”:“嵩”,“名字”:“天”,“单位”:“北京理工大学”},{“姓氏”:“礼”,“名字”:“欣”,“单位”:“北京理工大学”},{“姓氏”:“黄”,“名字”:“天羽”,“单位”:“北京理工大学”}]

7.4.2一二维数据的存储格式

  • 一位数据是最简单的数据组织类型,有多种存储格式,常用特殊字符分隔
    • 使用空格
    • 使用逗号
    • 用其他符号或符号组合分隔,建议采用不出现在数据中的特殊符号
  • 逗号分隔数值的存储格式叫做CSV格式(Comma-Separated Values,即逗号分隔模式)
  • CSV文件的每一行是一维数据,可以使用Python中的列表类型表示,整个CSV文件是一个二维数据,由表示每一行的列表类型作为元素,组成一个二维列表。
fo = open("price2016.csv","r")
ls=[]
for line in fo:
    line = line.replace("\n","")
    ls.append(line.split(","))//通过,分隔开,在每一行都分隔开。
print(ls)
fo.close()

运行结果:没有\n
[
[‘城市’,‘环比’,‘同比’,‘定基\n’],
[‘北京’,‘101.5’,‘120.7’,‘121.4\n’],
[‘上海’,‘101.2’,‘127.3’,‘127.8\n’],
[‘广州’,‘101.3’,‘119.4’,‘120.0\n’]
]

7.4.3二维数据写入CSV文件

fr = open("price2016.csv","r")
fw=open("price2016out.csv","w")
ls=[]
for line in fr:
	line = line.replace("\n","")
	ls.append(line.split(","))
for i in reage(len(ls)):
	for j in range(len(ls[i])):
		if ls[i][j].replace(".","").isnumeric():
			ls[i][j]="{:.2}%".format(float(ls[i][j])/100)
for row in ls:
	print(row)
	fw.write(",".join(row)+"\n")
fr.cloas()
fw.close()

7.5二维数据写入CSV文件

7.5.1二维数据写入CSV文件

#e13.1csv2html.py
seg1='''\n\n

2016年7月部分大中城市新建住宅价格指数

\n''' seg2="\n" seg3="
\n"
def fill_data(locls): seg = '{}{}{}{}\n'.format(*locls) return seg fr = open("price2016.csv","r") ls=[] for line in fr: line = line.replace("\n","") ls.append(line.split(",")) fr.close() fw = open("price2017.html","w") fw.write(seg1) fw.write('{}\n{}\n{}\n{}\n'.format(*ls[0])) fw.write(seg2) for i in range(len(ls)-1): fw.write(fill_data(ls[i+1])) fw.write(seg3) fw.close()

7.6高维数据的格式化

7.6.1高维数据的格式化

  • 高维数据能展示数据间更为复杂的组织关系
  • 为保持灵活性,表示高维数据不采用任何结构形式,仅采用最基本的二元关系,即键值对。
  • 万维网是高维数据最成功的典型引用。
  • JSON格式可以对高维数据进行表达和存储
  • JSON(JavaScript Object Notation:JavaScript对象简谱)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,易于阅读和理解。同时也易于机器解析和生成。
  • JSON格式表达键值对的基本格式如下,键值对都保存在双引号中:“Key”:“Value”

7.6.2JSON(JavaScript Object Notation)基本语法

  • 在js语言中,一切都是对象
  • 任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。
  • 对象和数组是比较特殊且常用的两种类型:
    • 对象表示为键值对
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组
  • JSON键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分隔,然后紧接着值:{“firstname”:“Json”}等价于JS语句{firstName : “Json”}

7.6.3Json与Js对象的关系

  • Json是JS对象的字符串表示法,他是用文本表示一个js对象的信息,本质是一个字符串。
    var obj = {a:“Hello”,b:“World”}//这是一个对象,注意键名也是可以使用引号包裹的。
    var json = ‘{“a” : “Hellow”,“b”:“World”}’//这是一个JSON字符串,本质是一个字符串。

7.6.4JSON和JS对象互转

  • 要实现从对象转换为JSON字符串,使用JSON.stringify()方法:
    var json = JSON.stringify({a:“Hello”,b:“World”})//结果是‘{“a”:“Hello”,“b”:“World”}’ 结果是字符串
    要实现从JSON转换为对象,使用JSON.parse()方法:
    var obj = JSON.parse(’{“a”:“Hello”,“b”:“World”}’)//结果是{a:‘Hello’,b:‘World’} 是一个对象。

7.6.5JSON的基本作用

  • JSON可以将JavaScript对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松传递这个字符串,并在需要的时候将他还原为各编程语言所支持的数据格式,例如在PHP中,keyijiangJSON还原为数组或者一个基本对象。
  • 在用到AJAX是,如果需要用到数组传值,这时就需要用JSON将数组转化为字符创。

7.6.6JSON标识对象与数组

  • JSON表示对象
    • JSON最常用的格式是对象的键值对。例如下面这样:{“firstName”:“Brett”,“lastName”:“McLaughlin”}
  • JSON表示数组
    • 和普通的JS数组一样,JSON表示数组的方式也是使用方括号[]。
    • {
      ​ “people”:
      ​ [
      ​ {“firstName”:“Brett”,“lastName”:“McLaughlin”},
      ​ {“firstName”:“Jason”,“lastName”:“Hunter”}
      ​ ]
      }

7.6.7高维数据的格式化

  • 当多个键值对放在一起时,JSON有如下一些约定:
    • 数据保存在键值对中
    • 键值对之间由逗号分隔
    • 括号用于保存键值对数据组成的对象
    • 方括号用于保存键值对数据组成的数组

7.7json库的使用

7.7.1Json库的概述

  • JSON库主要包含两类函数:操作类函数和解析类函数
    • 操作类函数主要完成外部JSON格式和程序内部数据类型之间的转换功能
    • 解析类函数主要用于解析键值对内容。

7.7.2Json库的解析

  • dumps()和loads()分别对应编码和解码功能
函数 描述
json.dump(obj,sort_keys=False,indent=None) 将Python的数据类型转换为JSon格式,属于编码过程把一个Python对象编码转换成JSON字符串,参数含义:obj:Python对象;sort_keys将数据根据keys的值进行排序,indent:(缩进数)应该是一个非负整型
json.loads(string) 将JSON格式字符串转换为Python数据类型,属于解码过程,把JSON格式字符串解码转换成Python对象
json.dump(obj,fp,sort_keys=False,indent=None) 与dunps()功能一致,输出到文件fp
json.load(fp) 与loads()功能一致,从文件fp读入
  • dumps()和loads()分别对应编码和解码的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqVwVssR-1588945271123)(C:\Users\60917\AppData\Roaming\Typora\typora-user-images\1588846199962.png)]

7.8CSV和JSON格式相互转化

7.8.1Json库的解析

  • CSV格式常用于一二维数据表示和存储,JSON也可以表示一二维数据。
  • 在网络信息传输中,可能需要统一的表示方式,因此,需要在CSV和JSON格式键进行相互转化。

7.8.2jiangCSV转换成JSON格式的代码如下:

#e14.1cvs2json.py
import json
fr = open("price2016.csv","r")
ls=[]
for line in fr:
	line = line.replace("\n","")
	ls.append(line.split(','))
fr.close()
fw = open("price2016.json","w")
for i in range(1,len(ls)):
	ls[i] = dict(zip(ls[0],ls[i]))#zip的作用就是把两个数组糅合起来
json.dump(ls[1:],fw,sort_keys= True,indent=4)
fw.close()

7.8.3将二维JSON格式数据转换成CSV格式

  • 将二维Json格式数据转换成CSV格式的代码如下:
#14.2json2csv
import json
fr = open("price2016.json","r")
ls = json.load(fr)
data = [list(ls[0].keys())]
for item in ls:
	data.append(list(item.values()))
fr.close()
fw = open("price2016_from_json.csv","w")
for item in data:
	fw.write(",".join(item)+"\n")
fw.close()
dump(ls[1:],fw,sort_keys= True,indent=4)
fw.close()

7.8.3将二维JSON格式数据转换成CSV格式

  • 将二维Json格式数据转换成CSV格式的代码如下:
#14.2json2csv
import json
fr = open("price2016.json","r")
ls = json.load(fr)
data = [list(ls[0].keys())]
for item in ls:
	data.append(list(item.values()))
fr.close()
fw = open("price2016_from_json.csv","w")
for item in data:
	fw.write(",".join(item)+"\n")
fw.close()

你可能感兴趣的:(Python)