创建流来从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

上一篇: creating stream to iterate over from string in Python

下一篇: Async/Await WCF client in a PCL