大家好,今天是21天python打卡第19天。今天通过案例将要学习到文本文件和二进制文件的区别,图像的处理,在图像的处理中,我们重点介绍了PIL的相关知识,最后,也是我们常用的csv文件的处理,如何读写和保存我们需要的结果文件。

活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录
首先我们先了解一下什么是文本文件和二进制文件。
文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。简单的说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。
从上面可以看出文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异,文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件则可看成是变长编码,因为是值编码,多少个比特代表一个值,完全由你决定。
文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。
一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。
记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应。
文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。
二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式
- textFile = open("7.1.txt","rt") #t 表示文本文件方式
- print(textFile.readline())
- textFile.close()
- binFile = open("7-1.txt","rb") #r 表示二进制文件方式
- print(binFile.readline())
- binFile.close()
- fname = input("请输入要打开的文件: ")
- fo = open(fname, "r")
- for line in fo.readlines():
- print(line)
- fo.close()
- fname = input("请输入要写入的文件: ")
- fo = open(fname, "w+")
- ls = ["唐诗", "宋词", "元曲"]
- fo.writelines(ls)
- for line in fo:
- print(line)
- fo.close()
PIL,全称python Image Library,主要作用是图像处理,可用于图片剪切、粘贴、缩放、镜像、水印、颜色块、滤镜、图像格式转换、色场空间转换、验证码、旋转图像、图像增强、直方图处理、插值和滤波等功能。不过只支持到Python 2.7。Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。我们需要安装的就是Pillow。
PIL具体用途:
- 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
- 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
- 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。
pip install Pillow
貌似Pillow是默认安装好了的,可以通过pip list查看是否已经安装
- from PIL import Image
- im = Image.open('pybit.gif') # 读入一个GIF文件
- try:
- im.save('picframe{:02d}.png'.format(im.tell()))
- while True:
- im.seek(im.tell()+1)
- im.save('picframe{:02d}.png'.format(im.tell()))
- except:
- print("处理结束")
- 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')
- from PIL import Image
- from PIL import ImageFilter
- im = Image.open('birdnest.jpg')
- om = im.filter(ImageFilter.CONTOUR)
- om.save('birdnestContour.jpg')
- from PIL import Image
- from PIL import ImageEnhance
- im = Image.open('birdnest.jpg')
- om = ImageEnhance.Contrast(im)
- om.enhance(20).save('birdnestEnContrast.jpg')
- from PIL import Image
- ascii_char = list('"$%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-/+@<>i!;:,\^`.')
- def get_char(r, b, g, alpha=256):
- if alpha == 0:
- return ' '
- gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
- unit = 256 / len(ascii_char)
- return ascii_char[int(gray//unit)]
- def main():
- im = Image.open('astro.jpg')
- WIDTH, HEIGHT = 100, 60
- im = im.resize((WIDTH, HEIGHT))
- txt = ""
- for i in range(HEIGHT):
- for j in range(WIDTH):
- txt += get_char(*im.getpixel((j, i)))
- txt += '\n'
- fo = open("pic_char.txt","w")
- fo.write(txt)
- fo.close()
- main()
-
- fo = open("price2016.csv", "r")
- ls = []
- for line in fo:
- line = line.replace("\n","")
- ls.append(line.split(","))
- print(ls)
- fo.close()
- fo = open("price2016bj.csv", "w")
- ls = ['北京', '101.5', '120.7', '121.4']
- fo.write(",".join(ls)+ "\n")
- fo.close()
- fo = open("price2016.csv", "r")
- ls = []
- for line in fo:
- line = line.replace("\n","")
- ls = line.line.split(",")
- lns = ""
- for s in ls:
- lns += "{}\t".format(s)
- print(lns)
- fo.close()
-
- fr = open("price2016.csv", "r")
- fw = open("price2016out.csv", "w")
- ls = []
- for line in fr: #将CSV 文件中的二维数据读入到列表变量
- line = line.replace("\n","")
- ls.append(line.split(","))
- for i in range(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: #将列表变量中的二位数据输出到CSV 文件
- print(row)
- fw.write(",".join(row)+"\n")
- fr.close()
- fw.close()
- #csv2html.py
- seg1 = '''
- \n\n\n
2016年7月部分大中城市新建住宅价格指数
\n'''- seg2 = "
\n"- seg3 = "
\n\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("price2016.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()
-
- #csv2json.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]))
- json.dump(ls[1:],fw, sort_keys=True, indent=4, ensure_ascii=False)
- fw.close()
- #json2csv.py
- 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经典案例。