用于在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()