第七章文件与数格式化
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’)
处理结果:
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='''<!DOCTYPE HTML>\n<html>\n<body><meta charset=gb2312><h2 align=center>2016年7月部分大中城市新建住宅价格指数</h2><table border='1' align='center' width=70%><tr bgcolor='orange'>\n'''
seg2="</tr>\n"
seg3="</table>\n"
def fill_data(locls):
seg = '<tr><td align = "center">{}</td><td align = "center">{}</td><td align = "center">{}</td><td align = "center">{}</td></tr>\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('<th width="25%">{}</th>\n<th width="25%">{}</th>\n<th width="25%">{}</th>\n<th width="25%">{}</th>\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>的基本格式如下,键值对都保存在双引号中:“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()