浅谈Python中类文件对象的使用

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)

很轻松地就将公式 s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} s=T1z1转成了图片,并保存为文件,如下图所示。

在这里插入图片描述

如果需要将这个图片进一步处理,并且没有保存该图片文件的需求,此时类文件对象就派上用场了。当然,前提是生成图像文件的函数支持类文件对象。比如,上面代码中用到的math_to_image()函数的__doc__提到,参数filename_or_obj可以是文件路径,也可以是类文件对象。

>>> 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)
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 15.20元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值