StringIO对象中readline()无法使用及逐行读取无输出的问题排查
StringIO写入后无法逐行读取?问题出在这儿!
我的问题场景
我想要将字符串写入StringIO()对象后逐行读取内容,但尝试了两种方法都没有产生任何输出。请问我哪里操作出错了?创建对象、写入内容并验证是否成功的代码如下:
from io import StringIO temp=StringIO() temp.write("This is a \n test sentence\n!") temp.getvalue() # 返回 'This is a \n test sentence\n!'
我试过的两种读取方法:
方法一
for line in temp: print(line)
方法二
test = True while test: line = temp.readline() if not line: test=False else: print(line)
问题原因与解决办法
嘿,这问题我之前也碰到过!核心原因超简单:当你写完内容到StringIO对象后,它的「读取指针」停在了内容的最后面——就像你写完一篇文档后,把光标移到了最后一行末尾,这时候再往下读,当然啥也没有啦~
而getvalue()是个例外,它不管指针在哪,都会直接返回全部内容,所以你之前能通过它看到内容,但普通的读取操作都得跟着指针位置走。
那怎么解决呢?给你两个实用办法:
办法1:手动把指针移回开头
用seek(0)方法就能把指针重置到文件起始位置,之后再读取就正常了。修改后的代码示例:
from io import StringIO temp=StringIO() temp.write("This is a \n test sentence\n!") # 关键一步:把指针移到开头 temp.seek(0) # 现在用方法一读取,就能输出内容了 for line in temp: print(line) # 如果读完一次后还要再读,记得再次调用seek(0)重置指针 temp.seek(0) test = True while test: line = temp.readline() if not line: test=False else: print(line)
办法2:创建对象时直接传入内容
如果你一开始就知道要写入的字符串,完全可以在初始化StringIO的时候直接把内容传进去,这时候指针默认就在开头,不用手动移动:
from io import StringIO # 直接传入初始内容,指针自动在开头 temp=StringIO("This is a \n test sentence\n!") # 直接读取即可 for line in temp: print(line)
内容的提问来源于stack exchange,提问作者LizzAlice
相关产品推荐
相关产品推荐

