我通过 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/