用Python创建迭代流从字符串中

2024-05-14 00:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python中的一个字符串创建一个流,这样它就相当于从文本文件中读取字符串。类似于:

for line in open('myfile.txt'): print line

除了“myfile.txt”的内容存储在字符串s中。这是正确的/最好的方法吗?

s = StringIO.StringIO("a\t\b\nc\td\n")
for line in s: print line

Tags: 方法字符串intxt内容forlineopen
2条回答

你可以用这样一个简单的generator function滚动你自己的:

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("foo\tbar\nbaz\n", "\t\n")
>>> for s in stream:
...     print(s)
...
foo
bar
baz

cStringIO可能更快(我还没有测试过),但这将使您在定义/使用分隔符时具有灵活性。

I want to create a stream from a string in Python so that it's equivalent to reading the string as if it's read from a text file.

Is this the correct/best way to do it?

是的,除非你真的想把它列入名单。

如果它打算一行一行地被消费,那么你这样做是有意义的。

StringIO()创建类似文件的对象。

文件对象有一个方法.readlines(),它将对象具体化为一个列表。不必具体化列表中的数据,您可以对其进行迭代,这是更轻松的内存:

# from StringIO import StringIO # Python 2 import
from io import StringIO # Python 3 import

txt = "foo\nbar\nbaz"

在这里,我们将每一行追加到列表中,这样我们就可以演示如何遍历类似文件的对象并对数据保持一个句柄。(更有效的方法是list(file_like_io)

m_1 = []
file_like_io = StringIO(txt)
for line in file_like_io:
    m_1.append(line)

现在:

>>> m_1
['foo\n', 'bar\n', '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

请记住,它是在换行符之后拆分的,同时也将它们保留在文本中,因此每打印一行将得到两个换行符,打印时为两倍间距。

相关问题 更多 >