【问题标题】:Printing list, strings and dict within one string using format in Python3.x使用 Python3.x 中的格式在一个字符串中打印列表、字符串和字典
【发布时间】:2019-07-21 13:04:06
【问题描述】:

我希望将查询数据库所需的字符串格式化如下:

SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10

以下内容来自字典:

  • field1, field2
  • measurement
  • nodename1
  • 10

字典如下:

conf = {
  'fields': ['field1', 'field2'],
  'measurement': 'measurement',
  'limit': 10,
  'tags': {'node': 'name1'}
}

我可以将字符串格式化为字符串的一部分(没有tags),如下所示:

    QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 LIMIT {}'.format(
             '","'.join(conf['fields'],
             conf['measurement'],
             conf['limit'])

这为我提供了:

SELECT "field1", "field2" FROM measurement WHERE "status"=0 LIMIT 10

问题

tags 中的键值对在许多情况下是动态的,即以前没有已知的key(在此示例中为node

对于字符串:

QUERY = 'SELECT {} FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}

我希望动态填充字符串格式AND "{}"=\'{}\'(事先不知道tags中的键值对

我如何做到这一点?

我不确定:

QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}'.format(
                '","'.join(conf['fields']),
                conf['measurement'],
                **conf['tags'],
                conf['limit']
            )

会抛出以下SyntaxError

SyntaxError: positional argument follows keyword argument unpacking

【问题讨论】:

  • 你的conf怎么样,能不能补充一下
  • 已经添加:见conf dict
  • @Shan-Desai 是 tags 总是只有一个键值对?
  • @Adam.Er8 对于初始情况是。
  • 如果我们使用 """ ,您拥有的第一个字符串只能在 python 中表示,因为您在那里都有单引号和双引号,对吗?还有为什么你有"node"='name1'而不是node=name1

标签: python python-3.x string string-formatting


【解决方案1】:

我事先使用字典conf['tags'] 创建了格式化字符串,以便更容易应用于QUERY

conf = {
  'fields': ['field1', 'field2'],
  'measurement': 'measurement',
  'limit': 10,
  'tags': {'node': 'name1'}
}

#Create the string using dictionary
dict_str = ''.join('"{}"=\'{}\''.format(key,value) for key, value in conf['tags'].items())

#Create the final format string
QUERY = 'SELECT "{}" FROM "{}" WHERE "status"=0 AND {} LIMIT {}'.format(
                '","'.join(conf['fields']),
                conf['measurement'],
                dict_str,
                conf['limit']
            )
print(QUERY)

输出将是

SELECT "field1","field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10

【讨论】:

  • 为我工作!我查看了客户端库,其中可能有一些内容可以对所有内容进行通用查询,然后使用 tags dict 解析它,但您的解决方案更清洁且易于使用。
【解决方案2】:

如果您使用的是 python 3.6 及更高版本,则可以使用here (python docs) 指定的 f-strings 进行字符串格式化的新方法。我不确定我是否理解您的要求,但我认为您的意思是这样:

key = list(conf['tags'].keys())[0]

QUERY = f"""SELECT {conf['fields'][0]}, {conf['fields'][1]} FROM "{conf['measurement']}" WHERE "status"=0 AND "{key}"='{conf['tags'][key]}' LIMIT {conf['limit']}"""

这导致了这个字符串:

SELECT "field1", "field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多