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

时间:2010-03-12 14:03:32

标签: python string

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 

我使用self.dumps列表来存储从打印件中获取的数据。是否有更方便的对象用于在内存中存储字符串行?理想情况下,我想把它转储成一个大字符串。我可以从上面的代码中得到它"\n".join(self.dumps)。可能最好只连接字符串 - self.dumps += text

2 个答案:

答案 0 :(得分:2)

要与''.join合并的字符串列表就可以了。但是,如果您更喜欢更直接的解决方案:

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()

getvalue在关闭之后无法在字符串io对象上调用(关闭对象使其删除自己的缓冲区内存),这就是我在此之前发出self.final的原因。除了getvalue之外,string-io对象是一个非常忠实的“类文件对象”接口的实现,所以当你只想要一段代码时,它通常会派上用场,最初设计为{ {1}}结果,将它们留在记忆中;但它也是一种“按片断构建一个字符串”的潜在巧妙方式 - 每个片段printwrite完成后(或者在整个过程中的任何时候看到你已经建立起来的东西)到目前为止。)

此任务的现代Python风格通常更喜欢低抽象方法(显式构建字符串列表并根据需要加入它们),但稍微高一些抽象的“字符串I / O”方法没有任何问题任

(第三种似乎有点失宠的方法是保留getvalueextend字符,只是为了全面列出这些字符; - )。

答案 1 :(得分:1)

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

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

所以,你的来源非常好。干得好!

PS:缺少flush()函数