StringIO经常被用来作字符串的缓存,因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作。StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。一个简单的例子,让你对StringIO有一个感性的认识:
import io #生成一个StringIO对象, s = io.StringIO()
#write()从读写位置将参数s写入到对象s,参数为str或unicode类型,读写位置被移动 s.write('Hello World\n')
#getvalue()用法:返回对象s中的所有数据 print(s.getvalue())
# read(n)用法:参数n用于限定读取的长度,类型为int,默认为从当前位置读取对象s中所有的数据。读取结束后,位置被移动。 s = io.StringIO('Hello World\n') print(s.read(1)) #结果 H print(s.read()) #结果 ello World
s = io.StringIO('Hello World\n') #readline(length)用法:length用于限定读取的结束位置,类型为int,缺省为None,即从当前位置读取至下一个以'\n'为结束符的当前行。读位置被移动。 print(s.readline(7)) #结果 Hello W s = io.StringIO('Hello\n World\n') print(s.readline(7)) #结果 Hello
a = ''' Hello World this is a tes ''' # readlines用法::读取所有行.,返回一个列表,会把换行符给读取出来,, s = io.StringIO(a) print(s.readlines()) #结果['\n', 'Hello\n', 'World\n', 'this\n', 'is\n', 'a\n', 'tes\n']
# StringIO还有一个对应的c语言版的实现,它有更好的性能,但是稍有一点点的区别: # cStringIO没有len和pos属性。(还有,cStringIO不支持Unicode编码) # 如果实例化一个带有默认数据的cStringIO.StringIO类。那么该实例是read-only的; # 无默认参数的是cStringIO.StringO,它是可读写的。cs = cStringIO.StringO() # StringIO模块主要用于在内存缓冲区中读写数据。模块是用类编写的,只有一个StringIO类, # 所以它的可用方法都在类中。此类中的大部分函数都与对文件的操作方法类似。
#利用BytesIO 获取图片的大小格式,
import io from PIL import Image # 注意我的Image版本是pip3 install Pillow==4.3.0 import requests res = requests.get('http://p99.pstatp.com/large/pgc-image/95b9aa2664c1441199795f84e2812e39.jpg', stream=True) # 获取字节流最好加stream这个参数,原因见requests官方文档 byte_stream = io.BytesIO(res.content) # 把请求到的数据转换为Bytes字节流(这样解释不知道对不对,可以参照有管的教程看一下) roiImg = Image.open(byte_stream) # Image打开Byte字节流数据 print(roiImg.format) # 获取图片的格式 print(roiImg.size) #获取图片的大小 imgByteArr = io.BytesIO() # 创建一个空的Bytes对象 imgByteArr = imgByteArr.getvalue() # 这个就是保存的图片字节流