如何获得可变字符串?

时间:2015-01-18 17:12:50

标签: python python-3.x

我正在生成sql查询并在我的字符串上执行了很多+ =操作。它看起来像:

insert_string = 'INSERT INTO ' + table_name + ' VALUES '
for row in data_frame.iterrows():
        raw_row = row[1].values
        insert_string += str(tuple(raw_row))

因此,如果我的insert_string是不可变的,则每个+ =操作都会创建新的字符串。例如,在C#中有StringBuilder类,可以初始化具有给定容量的空字符串。我怎么能用Python做到这一点?

4 个答案:

答案 0 :(得分:5)

也许最常见的方法是创建所有部分的列表,并使用str.join方法加入它们,如下所示:

pieces = ['a', 'b', 'c']
text = ''.join(pieces)
assert text == 'abc'

请注意,您将在分隔符上调用join方法,这些方法将介于各个部分之间。在前面的示例中,这是空字符串,但在您的情况下,您可能实际上需要类似空格甚至换行符的内容:

pieces = ['a', 'b', 'c']
text = '\n'.join(pieces)

此外,您可以使用io.StringIO类:

获得类似文件的界面
with io.StringIO() as query_str:
    query_str.write('INSERT INTO ')
    query_str.write(table_name)
    query_str.write(' VALUES ')
    for row in data_frame.iterrows():
        raw_row = row[1].values
        query_str.write(str(tuple(raw_row)))
    # Use query_str.getvalue(), as it will be deleted
    # when the 'with' scope is finished.

答案 1 :(得分:1)

在Python 2中,有一个名为UserString的模块,其中包含MutableString

from UserString import *

myString = MutableString('String')
myString.pop(0)
myString[1] = 'h'
print myString # prints 'thing'

答案 2 :(得分:1)

你可能正在寻找的是StringIO,它为字符串列表提供了一个类似文件的界面,并允许你在最后提取一个字符串:

import StringIO

builder = StringIO.StringIO()
builder.write('INSERT INTO ')
builder.write(table_name)
builder.write(' VALUES ')
for row in data_frame.iterrows():
        raw_row = row[1].values
        builder.write(str(tuple(raw_row)))
insert_string = builder.getvalue()

虽然,大多数python用户都很高兴直接使用列表,如Rafael's answer。为了完整性,这里将您的代码翻译成该样式:

builder = ['INSERT INTO ', table_name, ' VALUES ']
for row in data_frame.iterrows():
        raw_row = row[1].values
        builder.append(str(tuple(raw_row)))
insert_string = ''.join(builder)

在奇怪的情况下,查看此问题的人实际上需要一个可变的字符串;我很遗憾地说没有那样的东西,解决方案取决于你要解决的确切问题。如果你需要一个可变的字节字符串,那就是可用的,内置的,bytearray

>>> b
bytearray(b'xaby')
>>> b[1:3] = b'yz'
>>> b
bytearray(b'xyzy')
>>> b.extend(b'foonly')
>>> b
bytearray(b'xyzyfoonly')

str没有相应的操作。

答案 3 :(得分:1)

这是一篇关于Efficient String Concatenation in Python的好文章,非常适合您的问题。

tl; dr:将join与列表理解结合使用:

''.join([str(tuple(row[1].values)) for row in data_frame.iterrows()])