python - 使用 bool 键值对将字符串转换为字典格式

标签 python python-3.x python-2.7 dictionary

我通过 ast.literal_eval() 将字符串转换为 python 字典。该字符串包含 bool 值,因此 ast.literal_eval() 出现 ValueError

通过谷歌搜索,我发现我必须添加语句 ast.literal_eval(json.dumps(json.loads(data))) 来处理 bool 数据。

但是,我仍然遇到同样的错误。

这是代码片段:

#!/usr/bin/python
import sys
import os
import ast
import json

def main(argv):
    data = argv[1]
    print(argv[1])

    crldix = ast.literal_eval(json.dumps(json.loads(data)))

    for drive in crldix['files']:
        print("|{}|{}|".format(drive['name'], drive['boolkey']))

    return 0

if __name__ == "__main__":
    retval = main(sys.argv)
    exit(retval)

#eof

输出:

./test.py '{  "files": [   {  "name": "filename",    "boolkey": false  }  ] } '

Traceback (most recent call last):
  File "./test.py", line 20, in <module>
    retval = main(sys.argv)
  File "./test.py", line 12, in main
    crldix = ast.literal_eval(json.dumps(json.loads(data)))
  File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python2.7/ast.py", line 63, in _convert
    in zip(node.keys, node.values))
  File "/usr/lib/python2.7/ast.py", line 62, in <genexpr>
    return dict((_convert(k), _convert(v)) for k, v
  File "/usr/lib/python2.7/ast.py", line 60, in _convert
    return list(map(_convert, node.elts))
  File "/usr/lib/python2.7/ast.py", line 63, in _convert
    in zip(node.keys, node.values))
  File "/usr/lib/python2.7/ast.py", line 62, in <genexpr>
    return dict((_convert(k), _convert(v)) for k, v
  File "/usr/lib/python2.7/ast.py", line 79, in _convert
    raise ValueError('malformed string')
ValueError: malformed string

最佳答案

ast.literal_eval(json.dumps(json.loads(data))) 是多余的(看看我在这里做了什么?)

json.loads 已经返回一个字典,因此无需将其转回字符串,然后使用 literal_eval 返回字典。

由于 json.loads('{ "files": [ { "name": "filename", "boolkey": false } ] } ') 有效,因此您遇到的任何问题都是由于终端将字符串传递给 sys.argv 的方式。

我不知道您使用的是什么操作系统/终端,但通常需要 " 才能传递带空格的参数。这意味着您必须转义另一个 " 在字符串中。

例如,在 Windows 上,执行

import sys
import json

print(json.loads(sys.argv[1]))

如下方式(注意\用于转义)

python test.py "{ \"files\": [   {  \"name\": \"filename\",    \"boolkey\": false  }  ] } "

工作,输出:

{'files': [{'name': 'filename', 'boolkey': False}]}

另一种方法,无需转义":

import sys
import json

print(json.loads(sys.argv[1].replace("'", '"')))

然后执行

python test.py "{  'files': [   {  'name': 'filename',    'boolkey': false  }  ] }"

效果也一样。

关于python - 使用 bool 键值对将字符串转换为字典格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57443852/

相关文章:

python - 如何指定要在 x Axis 上绘制的离散值(matplotlib、箱线图)?

python - 使用列表理解进行多个操作的嵌套 for 循环

python - 在 Eclipse 上使用 web2py

python - 获取 Python 函数所需的参数

python - 计算列表中的重复项,并将该数字放入子列表中?

python - InvalidRequestError : Ambiguous column name '***' in result set, 当请求对 mysqldb 有效时?

python - 在 Python 中仅使用 While 循环打印星号箭头

Python:如何按字节 block 从标准输入读取直到 EOF?

python - 匹配同一字符串中的多个结果

python - 为什么 python glob 无法检测到我的拇指驱动器(我该怎么办?)