【21天python打卡】第19天 python经典案例(5)

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


活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。


目录

理解文本文件和二进制文件的区别

1、定义上的区别

2、存储方式上的区别

代码实现

文件处理

文本文件逐行打印

代码实现

向文件写入一个列表

代码实现

图像处理

PIL简介

GIF文件图像提取

代码实现

图像的颜色交换

代码实现

图像的轮廓获取

代码实现

图像的对比度增强

代码实现

图像的字符画绘制

代码实现

CSV处理

导入CSV格式数据到列表

代码实现

逐行处理CSV格式数据

代码实现

一维数据写入CSV文件

代码实现

二维数据写入CSV文件

代码实现

CSV格式的HTML展示

代码实现

CSV格式向JSON格式的转换

代码实现

JSON格式向CSV格式的转换

代码实现


理解文本文件和二进制文件的区别

首先我们先了解一下什么是文本文件和二进制文件。

1、定义上的区别

文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。简单的说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。

二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。

从上面可以看出文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异,文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件则可看成是变长编码,因为是值编码,多少个比特代表一个值,完全由你决定。

2、存储方式上的区别

文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。

一般来说,你选取的解码方式会是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简介

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查看是否已经安装

    GIF文件图像提取

    代码实现

    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()
    
    

    CSV处理

    导入CSV格式数据到列表

    代码实现

    fo = open("price2016.csv", "r")
    ls = []
    for line in fo:
        line = line.replace("\n","")
        ls.append(line.split(","))
    print(ls)
    fo.close()
    

    逐行处理CSV格式数据

    代码实现

    fo = open("price2016bj.csv", "w")
    ls = ['北京', '101.5', '120.7', '121.4']
    fo.write(",".join(ls)+ "\n")
    fo.close()
    

    一维数据写入CSV文件

    代码实现

    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()
    
    

    二维数据写入CSV文件

    代码实现

    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()
    

    CSV格式的HTML展示

    代码实现

    #csv2html.py
    seg1 = '''
    <!DOCTYPE HTML>\n<html>\n<body>\n<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</body>\n</html>"
    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("price2016.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()
    
    

    CSV格式向JSON格式的转换

    代码实现

    #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()
    

    JSON格式向CSV格式的转换

    代码实现

    #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经典案例。 

    来源:爱吃饼干的小白鼠

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【21天python打卡】第19天 python经典案例(5)

    发表评论