Python格式的字符串以及包含单个反斜杠的字符串

时间:2019-10-23 14:10:37

标签: python python-3.x clickhouse

我有一个简单但烦人的问题。我需要使用包含单引号的字符串来格式化字符串。假设我要格式化此字符串;

string_to_be_formatted = "Hello, {ANOTHER_STRING}"

然后我还有另一个字符串;

another_string = r"You\'re genius"

所以最后,我希望将字符串作为;

formatted_string = "Hello, You\'re genius"

当我打印formatted_string变量时,它会按预期进行打印,但是当我将其用作变量并对其进行格式化查询时,它将使用字符串的表示形式。到目前为止,我已经尝试过了;

  • literal_eval由于单个反斜杠而引发异常
  • 使用'!s'选项格式化字符串,结果相同

感谢您的帮助。

编辑:我认为这很可能与Python clickhouse_driver有关。抱歉,我将打开一个问题。

2 个答案:

答案 0 :(得分:0)

您使用了原始字符串来定义数据。这意味着最终字符串仍将包含反斜杠。如果这是一个错误,则解决方案很容易。

>>> template = "Hello, {data}"
>>> value = "You\'re genius"
>>> template.format(data=value)
"Hello, You're genius"

如果您确实有带反斜杠和单引号的字符串,则可以使用literal_eval,但要考虑到必须在末尾添加引号。

>>> template = "Hello, {data}"
>>> value = r"You\'re genius"  # the same as value = "You\\'re genius"
>>> template.format(data=ast.literal_eval(f'"{value}"'))
"Hello, You're genius"

如果您使用的是不带f字符串的旧版Python,则可以编写

>>> template.format(data=ast.literal_eval('"' + value + '"'))

答案 1 :(得分:0)

它需要使用参数化查询:

from clickhouse_driver import Client

client = Client(host='localhost')

another_string = r"You\'re genius"
string_to_be_formatted = f'''Hello, {another_string}'''


client.execute('INSERT INTO test (str) VALUES (%(str)s)', params={'str': string_to_be_formatted})
# SELECT *
# FROM test
#
# ┌─str───────────────────┐
# │ Hello, You\'re genius │
# └───────────────────────┘
#
# 1 rows in set. Elapsed: 0.001 sec.

print(client.execute("SELECT %(str)s", params={'str': string_to_be_formatted}))
# [("Hello, You\\'re genius",)]