1. 概念
所谓类文件对象(file-like object),简单说就是类似文件对象的对象,至少要具备read()和write()两个方法。由于磁盘文件的写入和读出速度远远小于内存的读写速度,当我们使用文件作为两个连续的处理过程的数据交换形式时,通常会选择使用类文件对象。2. 创建
Python中,通常使用io模块类实现文件对象。该模块提供了文本和二进制两种缓冲区,分别对应文本型和二进制型的类文件对象。>>> from io import StringIO, BytesIO
>>> tfo = StringIO() # 创建一个类文本文件对象
>>> bfo = BytesIO() # 创建一个类二进制文件对象
3. 使用
这里,tfo是一个类文本文件对象,bfo是一个类二进制文件对象,相当于使用open()函数在磁盘上创建的文件对象,因此,tfo和bfo除了必备的read()和write()方法外,还有close()、seek()、tell()、readline()、readlines()、writeline()、writelines()等普通文件对象的方法。此外,tfo和bfo还有不用于文件对象的一些方法,比如getvalue(),可以不受当前文件指针影响返回内容。>>> tfo.write('abc\n123') # 写入两行内容
7
>>> tfo.readlines() # 读取所有的行(此时文件指针在末尾)
[]
>>> tfo.seek(0) # 移动文件指针到开始位置
0
>>> tfo.readlines() # 读取所有的行
['abc\n', '123']
4. 实战
下面以一个实用的例子,演示类二进制文件对象在图像处理过程中的应用。我们知道,matplotlib支持LaTex语法,可以绘制复杂的数学公式。读一下matplotlib的源码就会发现,数学公式转图片是由mathtext.py这个脚本实现的,我们可以直接导入并使用它。>>> from matplotlib import mathtext
>>> str_latex = r'$s=\frac{1-z^{-1}}{T}$'
>>> mathtext.math_to_image(str_latex, 'out.png', dpi=300)
很轻松地就将公式转成了图片,并保存为文件,如下图所示。
![a1a8bde6b48b002c87745a3e9ab72722.png](https://i-blog.csdnimg.cn/blog_migrate/30f7dbd833d28cd58ac9807d53ffdf82.png)
>>> from io import BytesIO
>>> from matplotlib import mathtext
>>> bfo = BytesIO() # 创建类二进制文件对象
>>> str_latex = r'$s=\frac{1-z^{-1}}{T}$' # 待转换的数学公式
>>> mathtext.math_to_image(str_latex, bfo, dpi=300, format='png') # 将图片文件写入bfo
4.0
>>> len(bfo.getvalue()) # 可以查看图片文件的大小
2181
现在,bio保存了新生成的图片,使用read()可以读出文件内容。不过,对于图像文件来说,直接读取二进制内容并没有太多意义,更多场合下我们使用PIL或者OpenCV读取。
>>> from PIL import Image
>>> im = Image.open(bfo)
>>> im.size
(183, 62)
>>> im.mode
'RGBA'
>>> im.show()
这里,im是PIL的图像对象,可以使用NumPy转成OpenCV的图像对象(其实就是NumPy的ndarray对象)。
>>> import numpy as np
>>> im_cv = np.array(im)
>>> im_cv.shape
(62, 183, 4)
![db3676fb4dabbd3f95ff4432e2a326c1.png](https://i-blog.csdnimg.cn/blog_migrate/fa459830b270f6074af15ed111dfac91.jpeg)