创建流来从Python中的字符串迭代
我想从Python中的一个字符串创建一个流,以便它像阅读文本文件一样读取字符串。 就像是:
for line in open('myfile.txt'): print line
除非'myfile.txt'的内容存储在字符串s
。 这是否是正确/最好的方式?
s = StringIO.StringIO("atbnctdn")
for line in s: print line
我想从Python中的一个字符串创建一个流,以便它像阅读文本文件一样读取字符串。
这是否是正确/最好的方式?
是的,除非你真的想把它列入清单。
如果打算逐行消费,那么你这样做的方式是有道理的。
StringIO()
创建一个类文件对象。
文件对象有一个方法, .readlines()
,它将对象物化为列表。 您可以重复它,而不是实现列表中的数据,这是更多的内存光源:
# from StringIO import StringIO # Python 2 import
from io import StringIO # Python 3 import
txt = "foonbarnbaz"
在这里,我们将每行添加到列表中,以便我们可以演示迭代类文件对象并保留数据的句柄。 (效率更高的是list(file_like_io)
。
m_1 = []
file_like_io = StringIO(txt)
for line in file_like_io:
m_1.append(line)
现在:
>>> m_1
['foon', 'barn', 'baz']
你可以通过seek
将你的io返回到任何索引点:
>>> file_like_io.seek(0)
>>> file_like_io.tell() #print where we are in the object now
0
如果你真的想要它在一个列表中
.readlines()
实现了StringIO
迭代器,就像一个list(io)
- 这被认为是不太可取的。
>>> m_2 = file_like_io.readlines()
我们可以看到我们的结果是一样的:
>>> m_1==m_2
True
请记住,它们在换行符之后进行分割,并将它们保留在文本中,因此每条打印的线条都会有两条换行符,打印时为双倍间距。
你可以使用一个简单的生成器函数来滚动你自己:
def string_stream(s, separators="n"):
start = 0
for end in range(len(s)):
if s[end] in separators:
yield s[start:end]
start = end + 1
if start < end:
yield s[start:end+1]
用法示例:
>>> stream = string_stream("footbarnbazn", "tn")
>>> for s in stream:
... print(s)
...
foo
bar
baz
cStringIO可能会更快(我还没有测试过),但是这会给你定义/使用分隔符的灵活性。
链接地址: http://www.djcxy.com/p/19165.html