廖雪峰_StringIO和BytesIO_stream position问题详解搜集

解析搜集地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431918785710e86a1a120ce04925bae155012c7fc71e000#0

from io import StringIO;
    
f = StringIO();
f.write('Hello World');
s = f.readline();
print s;

上面这种方法无论如何都读不出f的内容,使用readlines和循环也不行

解析:

当使用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'

#这就涉及到了两个方法seek 和 tell。
#tell 方法获取当前文件读取指针的位置。
#seek 方法,用于移动文件读写指针到指定位置,有两个参数,第一个offset: 偏移量,需要向前或向后的字节数,正为向后,负4.为向前;第二个whence:可选值,默认为0,表示文件开头,1表示相对于当前的位置,2表示文件末尾。
#用seek方法时,需注意,如果你打开的文件没有用’b’的方式打开,则offset无法使用负值哦。

猜你喜欢

转载自blog.csdn.net/richand112233/article/details/88578954