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

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

Topic source

张子俊49673

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

回复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函数覆盖了初始化字符串。

viper1090

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

楼上正解呀,嘿嘿嘿?

神雕虾丶

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

http://www.cnblogs.com/hiwuchong/p/8613052.html 指针, 可以去这里学习一下

write将覆盖StringIO()构造的

你用write 的时候已经把123给覆盖了

陈_子语

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

@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的开始处

黄展奇

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

厉害

from io import StringIO
f = StringIO()
f.write('hello')
f.seek(0)
print(f.read())

黄展奇

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

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

秋枫pop

#50 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()) ” 我认为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


Reply