在Python中创建从字符串迭代的流

在Python中创建从字符串迭代的流,python,string,io,Python,String,Io,我想从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 我想从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
我想从Python中的字符串创建一个流,这样它就相当于从文本文件中读取字符串

这是正确的/最好的方法吗? 是的,除非你真的想把它列在清单上

如果你打算一行一行地使用它,那么你这样做是有意义的

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

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

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

txt = "foo\nbar\nbaz"
在这里,我们将每一行附加到一个列表中,这样我们就可以演示在类似文件的对象上进行迭代并保持数据的句柄。(更有效的方法是
列表(类似文件的io)

现在:

>>> m_1
['foo\n', 'bar\n', 'baz']
您可以使用
seek
将io返回到任何索引点:

>>> file_like_io.seek(0)
>>> file_like_io.tell() # 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]
可能更快(我还没有测试过),但这将为您定义/使用分隔符提供灵活性

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