## On the use of class file object in Python

Tianyuan prodigal son 2020-11-13 09:06:10
use class file object python

# 1. Concept

So called class file object （file-like object）, In short, it is a file object like object , At least you have to have read() and write() Two methods . Because the speed of disk file writing and reading is far less than that of memory , When we use files as a form of data exchange between two consecutive processes , You usually choose to use class file objects .

# 2. establish

Python in , Usually use io Module implements class file object . The module provides text and binary buffers , Corresponding to text type and binary type class file object respectively .

>>> from io import StringIO, BytesIO
>>> tfo = StringIO() # Create a class text file object
>>> bfo = BytesIO() # Create a class binary object


# 3. Use

here ,tfo Is a text like file object ,bfo A binary object is a class , It is equivalent to using open() Function creates a file object on disk , therefore ,tfo and bfo In addition to the essential read() and write() Outside method , also close()、seek()、tell()、readline()、readlines()、writeline()、writelines() Such as ordinary file object method . Besides ,tfo and bfo There are also methods that are not used for file objects , such as getvalue(), Can not be affected by the current file pointer to return content .

>>> tfo.write('abc\n123') # Write two lines
7
>>> tfo.readlines() # Read all lines （ At this point, the file pointer is at the end ）
[]
>>> tfo.seek(0) # Move the file pointer to the start position
0
['abc\n', '123']


# 4. actual combat

Here's a practical example , Demonstrate the application of class binary file object in image processing . We know ,matplotlib Support LaTex grammar , Can draw complex mathematical formulas . Read it matplotlib Source code will find out , The mathematical formula is transferred to the picture by mathtext.py This script implements , We can import it directly and use it .

>>> from matplotlib import mathtext
>>> str_latex = r'$s=\frac{1-z^{-1}}{T}$'
>>> mathtext.math_to_image(str_latex, 'out.png', dpi=300)


It's easy to put the formula s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} It turns into a picture , And save as a file , As shown in the figure below .

This image will need further processing if , And there is no need to save the image file , Class file objects come in handy . Of course , The premise is that the function generating the image file supports class file objects . such as , Used in the above code math_to_image() Functional __doc__ mention , Parameters filename_or_obj It can be a file path , It can also be a class file object .

>>> from io import BytesIO
>>> from matplotlib import mathtext
>>> bfo = BytesIO() # Create a class binary object
>>> str_latex = r'$s=\frac{1-z^{-1}}{T}$' # The mathematical formula to be converted
>>> mathtext.math_to_image(str_latex, bfo, dpi=300, format='png') # Write the picture file to bfo
4.0
>>> len(bfo.getvalue()) # You can see the size of the image file
2181


Now? ,bio Saved the newly generated image , Use read() You can read the contents of the file . however , For image files , Reading binary content directly doesn't make much sense , We use PIL perhaps OpenCV Read .

>>> from PIL import Image
>>> im = Image.open(bfo)
>>> im.size
(183, 62)
>>> im.mode
'RGBA'
>>> im.show()


here ,im yes PIL The image object of , have access to NumPy Turn into OpenCV The image object of （ In fact, that is NumPy Of ndarray object ）.

>>> import numpy as np
>>> im_cv = np.array(im)
>>> im_cv.shape
(62, 183, 4)