前言:
python2中的StringIO经常被用来作字符串的缓存,尤其是处理图片验证码的处理,近期牵扯tornado项目升级python3,简单学习了下python3中的io操作;因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作。StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。python2中是叫cStringIO,python3是归到IO中了:
本文只简单介绍python3下io中的StringIO和BytesIO()的操作:
StringIO
import io
#1、生成一个StringIO对象:
s = io.StringIO()
#2、write()从读写位置将参数s写入到对象s,参数为str或unicode类型,读写位置被移动
s.write('Hello World\n')
#3、getvalue()用法:返回对象s中的所有数据
print(s.getvalue())
#4、read(n)用法:参数n用于限定读取的长度,类型为int,默认为从当前位置读取对象s中所有的数据。读取结束后,位置被移动。
s = io.StringIO('Hello World\n')
print(s.read(2))
#结果 He
print(s.read())
#结果 llo world\n
s = io.StringIO('Hello World\n')
#5、readline(length)用法:length用于限定读取的结束位置,类型为int,缺省为None,即从当前位置读取至下一个以'\n'为结束符的当前行。读位置被移动。
print(s.readline(7))
#结果 Hello W
BytesIO
import io
#一样的使用方法:先实例化一个对象
s = io.BytesIO()
#可以把相关数据转换成bytes类型
s.write(b"hello world") #同一个对象使用write可以追加写
#getvalue获取写入的二进制数据
s.getvalue()
#输出:b'hello world'
#read方法同样适用:
s.read()可以读取全部内容,传递数字参数好像没什么用;
然后可以用作图片的处理:
from PIL import Image
import requests
res = requests.get('https://cn.bing.com/th?id=OHR.CorkTrees_ZH-CN1253123792_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp', stream=True)
# 初始化BytesIO对象并且写入数据
s = io.BytesIO(res.content)
r = Image.open(s) # Image打开Byte字节流数据
print(s.format) # 获取图片的格式
print(s.size) #获取图片的大小
r2 = io.BytesIO() # 创建一个空的Bytes对象
r2 = s.getvalue() # 这个就是保存的图片字节流