「这是我参与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