2010-03-12 30 views
1
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用於在Python中存儲字符串的對象

+0

有趣的文章與Python的字符串連接:http://www.skymind.com/~ocrow/python_string/。雖然現在有點老了。 – Mark 2010-03-12 14:50:48

回答

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對象是一個相當忠實的「類文件對象」接口實現,所以當你只想要一段代碼時,它通常會派上用場,原本設計爲print結果,並保留它們在內存,而不是;但是它也是一種可能的「整齊拼湊」的方式 - 只要完成了writegetvalue完成(或在過程中的任何時間查看您迄今爲止建立的內容)。

此任務的現代Python風格通常傾向於較低抽象的方法(明確地構建一個字符串列表並根據需要將它們聯合起來),但稍高的抽象「字符串I/O」沒有任何問題,也可以採用。 (第三種方法似乎有點失寵,爲了保持extend字符的array.array,只是爲了全面列舉這些;-)。

1

我很肯定,單個'\n'.join(self.dumps)會比self.dumps += text快得多。

說明:在Python中,字符串是不可變的,所以如果您連接兩個字符串,則會生成一個新字符串並將其他兩個字符串複製到其中。如果你只做一次,這不是問題,但是在循環內部,這將在每次迭代中複製整個文本。另一方面,join()是用C語言編寫的內置函數,它能夠有效地重新分配內存並更改字符串的末尾。所以,它應該快得多。

所以,你的來源完全沒問題。做得好!

PS:沖洗()函數缺少

相關問題