有关使用stringIO读写文件有个问题
Topic source@xigaohu
还有个问题 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
结论是:write覆盖了原来的内容 具体过程是: 1.f = StringIO("1\n2\n3") // f.tell() = 0 2.f.write("4\n 5\n 6") // f.write 从 f.tell() 的位置开始写,所以覆盖了原来的内容,此时StringIO = "4\n 5\n 6",所以f.seek(0)不是只能回到用write的开始处
from io import StringIO
f = StringIO()
f.write('hello')
print(f.tell()) ==>5
f.seek(0)
print(f.tell()) ==>0
print(f.read())
print(f.tell()) ==5
f.write('new')
print(f.tell()) ==>8
f.seek(0)
print(f.read()) ==>hellonew
“还有个问题 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()) ” 我认为10楼这里的问题,是因为没有理解到初始化StringIO时,会将seek也初始化为0,write之后,seek才会自动跑到末尾。不信你每写入一次,用f.tell()查看下seek的位置。 如果初始化后没有将seek调到最后再write的话,下一次的write会被覆盖掉。
所以正确的方法应该是: f = StringIO("1\n2\n3") f.seek(7) f.write("4\n 5\n 6")
四楼正解,但是有一点,在f.readline()之前f.tell() stream position已经是11了,又试了下,stream position在write函数之前是0,,在write函数之后就变成了11
张子俊49673
回复xigaohu
f = StringIO("1\n2\n3")
初始化后用 f.tell() 查看stream position,发现返回的是0,说明初始化一个实例不改变 stream position。 之后再运行 f.write("4\n 5\n 6") 这时 f.tell() 返回的是5。 就算通过 f.seek(0) 使得stream position归0,将f逐行输出的也没有1 2 3。 至此,可推测出write函数覆盖了初始化字符串。