Discuss / Python / 有关使用stringIO读写文件有个问题

有关使用stringIO读写文件有个问题

Topic source

努云尼尼

#1 Created at ... [Delete] [Delete and Lock User]
from io import StringIO;

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

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

from io import StringIO;

f = StringIO('Hello World');
s = f.readline();
print s;

上面是文中介绍的先初始化一个stringIO流,然后readline读取内容,这样就可以

为什么会这样呢?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

StringIO要么用来读,要么用来写,不能同时用

可以同时用吧?用getvalue()就行了啊

Im痞子

#4 Created at ... [Delete] [Delete and Lock User]

是因为the stream position的原因,当你用:

d = StringIO('Hello World')

其stream position为0(可以通过d.tell()获得),而后执行

d.readline()

stream position移动到11.因此在执行此方法时,返回的是空字符串。

类似的,使用

f = StringIO()

stream position也为0,而执行

f.write('Hello World')

stream position就移动到11了,因此你再执行readline时返回的依旧是空字符串,若你需要返回'Hello World'可以通过

f.seek(0)

调整stream position即可。

楼上正解

楼上正解,本人亲测!

顶楼上,这个解答是对的,亲测,

from io import StringIO f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') f.read() b'\xe4\xb8\xad\xe6\x96\x87'

这个例子中亲测也得通过f.seek(0)来重置为0才能顺利输出

额 对了,StringIO改成BytesIO

Rainsho

#9 Created at ... [Delete] [Delete and Lock User]

seek和tell,恩,这两个属性不错~

xigaohu

#10 Created at ... [Delete] [Delete and Lock User]

还有个问题 seek只能回到用write的开始处,直接构造的回不去?还是write将覆盖StringIO()构造的?

from io import StringIO
f = StringIO("1\n2\n3")
f.write("4\n 5\n 6")
f.seek(0)
while True:
    s = f.readline()
    if s == "":
        break
    print(s.strip())

结果为

4
5
6

没有1,2,3


Reply