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无法使用负值哦。