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
?
答案 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}}结果,将它们留在记忆中;但它也是一种“按片断构建一个字符串”的潜在巧妙方式 - 每个片段print
和write
完成后(或者在整个过程中的任何时候看到你已经建立起来的东西)到目前为止。)
此任务的现代Python风格通常更喜欢低抽象方法(显式构建字符串列表并根据需要加入它们),但稍微高一些抽象的“字符串I / O”方法没有任何问题任
(第三种似乎有点失宠的方法是保留getvalue
个extend
字符,只是为了全面列出这些字符; - )。
答案 1 :(得分:1)
我很确定,单个'\n'.join(self.dumps)
会比self.dumps += text
快得多。
说明:在Python中,字符串是不可变的,因此如果连接两个字符串,则会生成一个新字符串,并将另外两个字符串复制到其中。如果你只做一次这不是问题,但在循环中,这将在每次迭代中复制整个文本。另一方面,join()
是用C编写的内置函数,它能够有效地重新分配内存并更改字符串的结尾。所以,它应该更快。
所以,你的来源非常好。干得好!
PS:缺少flush()函数