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

举报
天元浪子 发表于 2021/07/26 23:26:35 2021/07/26
【摘要】 1. 概念 所谓类文件对象(file-like object),简单说就是类似文件对象的对象,至少要具备read()和write()两个方法。由于磁盘文件的写入和读出速度远远小于内存的读写速度,当我们使用文件作为两个连续的处理过程的数据交换形式时,通常会选择使用类文件对象。 2. 创建 Python中,通常使用io模块实现类文件对象。该模块提供了文本和二进制两种缓...

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=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

  
 
  • 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。