【问题标题】:Convert a Python string without quotes to dictionary将不带引号的 Python 字符串转换为字典
【发布时间】:2022-07-20 16:48:00
【问题描述】:

我需要将 Python 字符串(字符串内不带引号)转换为字典。该字符串具有正确的格式,但缺少每个子字符串中的引号。

例子:

a_string = "{Name: 2, Test: 52, Number: 150}"

谢谢!

【问题讨论】:

  • JSON5 解析器可以做到。
  • yaml 解析器也应该可以工作。
  • 除非您特别询问如何解决跨版本兼容性问题(在这种情况下,您的问题显然应该描述该问题),否则您不应混用python-2.7python-3.x 标签。我已经删除了它们。
  • 试试:yaml.safe_load(a_string)

标签: python


【解决方案1】:
import yaml
d = yaml.safe_load("{Name: 2, Test: 52, Number: 150}")
print(d)
# {'Name': 2, 'Test': 52, 'Number': 150}

但请记住 YAML 语法的可能含义,例如。字符串中的 NO 将被解释为布尔值 False

【讨论】:

    【解决方案2】:

    如果你的实际格式真的和你的例子一样简单,那么做起来并不难:

    >>> a_string = "{Name: 2, Test: 52, Number: 150}"
    >>> cleaned = a_string.strip().lstrip('{').rstrip('}')
    >>> cleaned
    'Name: 2, Test: 52, Number: 150'
    >>> pairs = [part.split(':') for part in cleaned.split(',')]
    >>> pairs
    [['Name', ' 2'], [' Test', ' 52'], [' Number', ' 150']]
    >>> {pair[0].strip(): int(pair[1].strip()) for pair in pairs}
    {'Name': 2, 'Test': 52, 'Number': 150}
    

    如果它更复杂,或者将来可能变得更复杂,我会推荐使用 YAML 或 JSON5 解析器。

    【讨论】:

      【解决方案3】:

      首先,您需要以某种方式将您的键转换为字符串(或除文本以外的任何内容)。例如来自

      "{Name: 2, Test: 52, Number: 150}"
      

      "{'Name': 2, 'Test': 52, 'Number': 150}"
      

      那么你可以使用ast 模块

      >>> import ast
      >>> ast.literal_eval("{'Name': 2, 'Test': 52, 'Number': 150}")
      {'Name': 2, 'Test': 52, 'Number': 150}
      

      【讨论】:

        【解决方案4】:

        如果键是字符串,值是整数,您可以使用regex 并将key 替换为'key',然后使用ast.literal_eval。

        a_string = "{Name: 2, Test: 52, Number: 150}"
        res = re.sub('([a-zA-Z]+)', r"'\1'", a_string) # name -> 'name'
        ast.literal_eval(res)
        {'Name': 2, 'Test': 52, 'Number': 150}
        

        【讨论】:

          猜你喜欢
          • 2017-11-27
          • 2019-03-07
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-19
          • 2013-03-13
          • 2017-03-23
          相关资源
          最近更新 更多