Python中StringIO与BytesIO及上下文管理

959 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

第一部分::StringIO与BytesIO

真文件:在关闭文件的时候文件内容不会丢失。
假文件:在关闭文件的时候文件内容会丢失。

(1)StringIO:

StringIO顾名思义就是在内存中读写str
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

import io          				 	 #创建IO操作:
sio = io.StringIO()

sio.write('好好学习,天天向上')		 #写入

print(sio.getvalue())   		     #可以多次读取,没有光标的问题存在
print(sio.getvalue())    			 #也可以获取到
sio.close()							 #关闭
print(sio.getvalue())       #报错,获取不到。
                            # 当创建的StringIO调用 close() 方法时,
                            # 在内存中的数据会丢失

(2)BytesIO字节流:

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes!

BytesIO 和 StringIO 类似,但是BytesIO操作的是Bytes数据,decode解码

import io
bio = io.BytesIO()
bio.write(b'hsfdhdsf124')   	  #如果写入字母或者数字时,注意在引号前面加上b
print(bio.getvalue())

bio.write('吴某'.encode())        #如果写入汉字的话,要进行编码,默认为utf-8
print(bio.getvalue().decode())    #那么如果想获取的话就要进行解码,如果不解码就是二进制形式

注意:
调用close()方法,保存内存中的数据,保证内存中的数据不会丢失。
防止占用某一个资源。如果不关闭的话,那么这个IO资源就会被他一直占用,别人想用就没法用了。

第二部分::上下文管理 with.......as

作用:让python自动执行关闭过程,即调用close()方法。
管理多个文件自动关闭。

首先来看,单个文件操作时:

with open(file_path, mode='r') as f:
    # 对f进行一系列操作
    # 也可以执行别的操作

跳出with语句快的时候自动执行f.close()

然后来看,多个文件操作时:

with open(file_path, mode='r') as f1,\
         open(file_path, mode='r') as f2,\
         .
         .
         .
         open(file_path, mode='r') as fn:
    # 对f进行一系列操作
    # 也可以执行别的操作

file.closed  查看文件是否关闭了

跳出with语句块的时候自动执行f.close()

最后来看看:
两个底层方法:enter__和__exit

class Person:
    def __enter__(self):                        # 进入的时候自动调用
        print('this is enter')
        return '吴某好帅'


    def __exit__(self,exc_type,exc_val,exc_tb):    #退出的时候自动调用
        print("this is exit")

#with可以打开类,进行多个方法的管理

a = Person()
with a as f:           #with可以管理多个软件,打开多个软件。
    print(111)         #我们打开这个类,就会自动调用__enter__方法,然后进行打印111的操作
    print(f)           #f就是__enter__的返回值

结束之后就会自动调用__exit__方法

输出为:
this is enter
111
吴某好帅
this is exit