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

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

Topic source

Todd_wu

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

楼上的大神解释的太详细了,第一次了解到stream position的概念

黑岩74032

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

没有1,2,3的那位,可以输出f.tell()看下,初始StringIO("1\n2\n3")后的position也是0,所以你接着write和初始StringIO()时是一样的,所以你如果需要123可以在write前f.seek()或者f.read()调整position的值就可以了。

C0592noob

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

使用f.write()字符串插入的位置和和f.tell()的值有关系.

在此插入代码

from io import StringIO

f = StringIO("1\n2\n3") f.tell() # 返回值为0,此时使用f.write() 将会覆盖初始值。 f.read()或者f.seek(5) # f.tell()返回值为5 f.write('4\n5\n6') # f.tell()返回值为10 f.seek(0) # f.tell()返回值为0 f.read() # 输出'1\n2\n34\n5\n6'

直接构造的时候:

f = StringIO("1\n2\n3")

构造完毕,f在最前面,也就是position = 0的位置。这时候再写入,write导致指针后移,覆盖了原先占据5个字节位的数据,也就是你一开始构造的"1\n2\n3",写入了write中的"4\n5\n6,所以回到原位的时候只能读到456了。

houbo111

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

经过测试,老师说的StringIO读和写不能同时使用是有道理的

from io import StringIO
f=StringIO('12345')
print(f.tell())#>>> 0
print(f.read())#>>> 12345
print(f.tell())#>>> 5
f.write('a')
print(f.tell())#>>> 5 如果没有print(f.read())这里是1
f.seek(0)
print(f.read())#>>> a
print(f.getvalue())#>>> a
这里使用write会把原来StringIo的内容覆盖,所以最好不要使用StringIo同时读写

houbo111

#17 Created at ... [Delete] [Delete and Lock User]
f.seek(0)上面应该是6

想这挺好

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

后面的write应该把创建对象时候的初始化的123给覆盖掉了,所以怎么弄都只能输出write的内容了。 用tell()看,stream position是0.

小辻小十

#19 Created at ... [Delete] [Delete and Lock User]
from io import StringIO
f = StringIO("1\n2\n3")
f.seek(0,2)
f.write("4\n 5\n 6")
f.seek(0)
while True:
    s = f.readline()
    if s == "":
        break
    print(s.strip())

读写是可以同时进行的,我猜老师的意思是不建议,因为write()是覆盖的。如果要同时进行读写的话,需要找准位置。就是在写之前加一句f.seek(0,2)。 file.seek()方法标准格式是:seek(offset,whence=0) offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起,默认为0。

廖雪峰

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

99%的情况下并不需要同时读写

一个fp要么读要么写会显著地简化代码复杂度,并且顺序读写效率最高


Reply