如何获取可变字符串?
How to get mutable string?
我正在生成 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 class 用于此,它可以初始化具有给定容量的空字符串。我怎样才能在 Python 中做到这一点?
在Python2中,有一个名为UserString
的模块包含MutableString
。
from UserString import *
myString = MutableString('String')
myString.pop(0)
myString[1] = 'h'
print myString # prints 'thing'
也许最常见的方法是创建所有片段的列表,然后使用 str.join
方法将它们连接起来,如下所示:
pieces = ['a', 'b', 'c']
text = ''.join(pieces)
assert text == 'abc'
请注意,您在 分隔符 上调用了 join
方法,它将出现在片段之间。在前面的示例中,那是空字符串,但在您的情况下,您实际上可能想要 space 甚至换行符:
pieces = ['a', 'b', 'c']
text = '\n'.join(pieces)
此外,您可以使用 io.StringIO
class:
获得类似文件的界面
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.
您可能正在寻找的是 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 用户喜欢直接使用列表,如 。为了完整起见,您的代码已翻译成该样式:
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)
在奇怪的情况下,查看此问题的人实际上需要一个可变字符串;很遗憾地说,没有什么比这更好的了,解决方案在一定程度上取决于您要解决的具体问题。如果你需要一个可变的 byte 字符串,它是可用的,内置的,如 bytearray
.
>>> b
bytearray(b'xaby')
>>> b[1:3] = b'yz'
>>> b
bytearray(b'xyzy')
>>> b.extend(b'foonly')
>>> b
bytearray(b'xyzyfoonly')
不过 str
没有等效的操作。
这里有一篇关于 Efficient String Concatenation in Python 的好文章,非常适合您的问题。
tl;dr:使用 join
和列表理解:
''.join([str(tuple(row[1].values)) for row in data_frame.iterrows()])
我正在生成 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 class 用于此,它可以初始化具有给定容量的空字符串。我怎样才能在 Python 中做到这一点?
在Python2中,有一个名为UserString
的模块包含MutableString
。
from UserString import *
myString = MutableString('String')
myString.pop(0)
myString[1] = 'h'
print myString # prints 'thing'
也许最常见的方法是创建所有片段的列表,然后使用 str.join
方法将它们连接起来,如下所示:
pieces = ['a', 'b', 'c']
text = ''.join(pieces)
assert text == 'abc'
请注意,您在 分隔符 上调用了 join
方法,它将出现在片段之间。在前面的示例中,那是空字符串,但在您的情况下,您实际上可能想要 space 甚至换行符:
pieces = ['a', 'b', 'c']
text = '\n'.join(pieces)
此外,您可以使用 io.StringIO
class:
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.
您可能正在寻找的是 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 用户喜欢直接使用列表,如
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)
在奇怪的情况下,查看此问题的人实际上需要一个可变字符串;很遗憾地说,没有什么比这更好的了,解决方案在一定程度上取决于您要解决的具体问题。如果你需要一个可变的 byte 字符串,它是可用的,内置的,如 bytearray
.
>>> b
bytearray(b'xaby')
>>> b[1:3] = b'yz'
>>> b
bytearray(b'xyzy')
>>> b.extend(b'foonly')
>>> b
bytearray(b'xyzyfoonly')
不过 str
没有等效的操作。
这里有一篇关于 Efficient String Concatenation in Python 的好文章,非常适合您的问题。
tl;dr:使用 join
和列表理解:
''.join([str(tuple(row[1].values)) for row in data_frame.iterrows()])