浅谈Python中类文件对象的使用
1. 概念
所谓类文件对象(file-like object),简单说就是类似文件对象的对象,至少要具备read()和write()两个方法。由于磁盘文件的写入和读出速度远远小于内存的读写速度,当我们使用文件作为两个连续的处理过程的数据交换形式时,通常会选择使用类文件对象。
2. 创建
Python中,通常使用io模块实现类文件对象。该模块提供了文本和二进制两种缓冲区,分别对应文本型和二进制型的类文件对象。
>>> from io import StringIO, BytesIO
>>> tfo = StringIO() # 创建一个类文本文件对象
>>> bfo = BytesIO() # 创建一个类二进制文件对象
- 1
- 2
- 3
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']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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)
- 1
- 2
- 3
很轻松地就将公式 s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} s=T1−z−1转成了图片,并保存为文件,如下图所示。
如果需要将这个图片进一步处理,并且没有保存该图片文件的需求,此时类文件对象就派上用场了。当然,前提是生成图像文件的函数支持类文件对象。比如,上面代码中用到的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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
现在,bio保存了新生成的图片,使用read()可以读出文件内容。不过,对于图像文件来说,直接读取二进制内容并没有太多意义,更多场合下我们使用PIL或者OpenCV读取。
>>> from PIL import Image
>>> im = Image.open(bfo)
>>> im.size
(183, 62)
>>> im.mode
'RGBA'
>>> im.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这里,im是PIL的图像对象,可以使用NumPy转成OpenCV的图像对象(其实就是NumPy的ndarray对象)。
>>> import numpy as np
>>> im_cv = np.array(im)
>>> im_cv.shape
(62, 183, 4)
- 1
- 2
- 3
- 4
文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。
原文链接:xufive.blog.csdn.net/article/details/109022519
- 点赞
- 收藏
- 关注作者
评论(0)