用于在Python中存储字符串的对象

用于在Python中存储字符串的对象,python,string,Python,String,我使用self.dumpslist来存储从打印中获得的数据。有没有更方便的对象来存储内存中的字符串行?理想情况下,我想把它扔到一根大绳子上。我可以这样从上面的代码中得到它“\n”.join(self.dumps)。可能只是串接字符串更好-self.dumps+=text?我很确定,单个'\n'.join(self.dumps)将比self.dumps+=text快得多 解释:在Python中,字符串是不可变的,因此,如果合并两个字符串,将生成一个新字符串,并将另外两个字符串复制到其中。如果只做一

我使用
self.dumps
list来存储从打印中获得的数据。有没有更方便的对象来存储内存中的字符串行?理想情况下,我想把它扔到一根大绳子上。我可以这样从上面的代码中得到它
“\n”.join(self.dumps)
。可能只是串接字符串更好-
self.dumps+=text

我很确定,单个
'\n'.join(self.dumps)
将比
self.dumps+=text
快得多

解释:在Python中,字符串是不可变的,因此,如果合并两个字符串,将生成一个新字符串,并将另外两个字符串复制到其中。如果只做一次,这不是问题,但是在循环中,每次迭代都会复制整个文本<另一方面,code>join()是一个用C编写的内置函数,它能够有效地重新分配内存并更改字符串的结尾。所以,它应该快得多

所以,你的消息来源很好。干得好


PS:flush()函数缺少要与
''连接的字符串列表。连接即可。但是,如果您更喜欢更直接的解决方案:

class MyWriter:

    def __init__(self, stdout):
        self.stdout = stdout
        self.dumps = []

    def write(self, text):
        self.stdout.write(smart_unicode(text).encode('cp1251'))
        self.dumps.append(text)

    def close(self):
        self.stdout.close()   

writer = MyWriter(sys.stdout)
save = sys.stdout
sys.stdout = writer 
getvalue
不能在字符串io对象关闭后调用(关闭该对象会使其丢失自己的缓冲内存),这就是为什么我在关闭之前创建了
self.final
。除了
getvalue
,string io对象是“类似文件的对象”接口的一个非常忠实的实现,因此当您只想拥有一些最初设计用于打印结果的代码时,它通常会派上用场,而不是将它们保存在内存中;但它也是一种潜在的“逐段构建字符串”的简洁方法——只需
编写每个片段,并在完成时
getvalue
(或者在过程中的任何时候查看到目前为止构建的内容)

这个任务的现代Python风格通常更喜欢较低抽象的方法(显式地构建字符串列表并在需要时将它们连接起来),但是稍微高一点的抽象“字符串I/O”方法也没有什么错


(第三种似乎有点不受欢迎的方法是保持
扩展
一个
数组.array
字符,只是为了全面列出这些;-)。

关于Python字符串连接的有趣文章:。不过现在有点旧了。
import cStringIO

class MyWriter(object):

    def __init__(self, stdout):
        self.stdout = stdout
        self.dumps = cStringIO.StringIO()
        self.final = None

    def write(self, text):
        self.stdout.write(smart_unicode(text).encode('cp1251'))
        self.dumps.write(text)

    def close(self):
        self.stdout.close()
        self.final = self.dumps.getvalue()
        self.dumps.close()

    def getvalue(self):
        if self.final is not None:
            return self.final
        return self.dumps.getvalue()