StringIO and BytesIO
Topic source其实层主这里之所以文件的指针位置需要修改,是因为涉及到一个没有被提及的小知识点:
当使用StringIO()去初始化的时候,其指针是指向0的位置;而如果是用write的方法的时候,其指针则是会移动到后面的。
举例如下:
sio = StringIO('abc') sio.getvalue() 'abc' sio = StringIO('def') sio.getvalue() 'def'
上面这里显示使用StringIO()进行初始化,是覆盖原值的,指针始终是指向0的位置。
对比write的方法:
a = StringIO() a.write('123') 3 a.getvalue() '123' a.write('456') 3 a.getvalue() '123456'
可以看出,write的方法本质上是追加。
再举例如下:
sio = StringIO('abc') #这里是初始化,指针指向0 sio.getvalue() 'abc'
sio = StringIO('def') #这里是再次初始化,指针仍然指向0 sio.getvalue() 'def' #def覆盖原值abc sio.write('ghi') #这里要注意了,虽然是追加,但是由于指针仍然是0,所以实际上仍然会覆盖掉原值 3 sio.getvalue() 'ghi' sio.write('ghi') #上面第一次追加以后,指针就向后移动,所以此处才真正起到追加的效果 3 sio.getvalue() 'ghighi'
7L的大神已经讲的很清楚了,非常感谢各位大神,我进一步验证一下: >>>a = StringIO('abcdefg') >>>a.getvalue() 'abcdefg' >>>a.write('12') 2 >>>a.getvalue() '12cdefg'
先初始化再write(),得到的指针是指向write()写入str的末尾,给个例子好看一点:
先初始化字符串 abcdefg 接着write()字符串 hij 使用f.tell()得到结果3,说明最后的指针是指向write()写入str的末尾 使用getvalue(),得到hijdefg
Mr_RightMen