当前位置: 首页 > 面试题库 >

在Python中将str转换为dict

叶浩荡
2023-03-14
问题内容

我是使用subprocess.Popen()从进程的输出中获得的:

    { about: 'RRDtool xport JSON output',
  meta: {
    start: 1401778440,
    step: 60,
    end: 1401778440,
    legend: [
      'rta_MIN',
      'rta_MAX',
      'rta_AVERAGE'
          ]
     },
  data: [
    [ null, null, null ],
    [ null, null, null ],
    [ null, null, null ],
    [ null, null, null ],
    [ null, null, null ],
    [ null, null, null  ]
  ]
}

对我来说,它似乎不是有效的json。我已经使用ast.literal_eval()json.loads(),但是没有运气。有人可以在正确的方向帮助我吗?提前致谢。


问题答案:

确实,rddtool导出ECMA脚本而不是JSON的旧版本。根据此debian错误报告,升级1.4.8应该会给您适当的JSON。另请参阅项目CHANGELOG:

现在,通过正确引用xport的键,xport的JSON输出实际上实际上是json编译的。

如果您无法升级,则这里有两个选择。要么尝试重新格式化以应用引用的对象密钥标识符,要么使用更宽松的解析器并解析ECMA脚本对象表示法。

后者可以通过外部demjson库完成:

>>> import demjson
>>> demjson.decode('''\
... { about: 'RRDtool xport JSON output',
...   meta: {
...     start: 1401778440,
...     step: 60,
...     end: 1401778440,
...     legend: [
...       'rta_MIN',
...       'rta_MAX',
...       'rta_AVERAGE'
...           ]
...      },
...   data: [
...     [ null, null, null ],
...     [ null, null, null ],
...     [ null, null, null ],
...     [ null, null, null ],
...     [ null, null, null ],
...     [ null, null, null  ]
...   ]
... }''')
{u'about': u'RRDtool xport JSON output', u'meta': {u'start': 1401778440, u'step': 60, u'end': 1401778440, u'legend': [u'rta_MIN', u'rta_MAX', u'rta_AVERAGE']}, u'data': [[None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None]]}

可以使用正则表达式进行修复;我将假定所有标识符都在新行上或紧接在{花括号后。列表中的单引号必须更改为双引号。只有在值中也没有嵌入单引号的情况下,这才起作用:

import re
import json

yourtext = re.sub(r'(?:^|(?<={))\s*(\w+)(?=:)', r' "\1"', yourtext, flags=re.M)
yourtext = re.sub(r"'", r'"', yourtext)
data = json.loads(yourtext)


 类似资料:
  • 问题内容: 我正在创建一个与opencv共享视频的系统,但是我遇到了问题。我有一个服务器和一个客户端,但是当我向服务器发送信息时,必须为字节。我发送两件事: ret是一个booland框架,是数据视频,一个numpy.ndarray ret没问题,但是是框架:我先将其转换为字符串,然后转换为字节: 我现在想再次在numpy.ndarray中转换帧。 问题答案: 你错了 如果将其打印到终端,则会发现

  • 问题内容: 我正在尝试编写文本游戏,但在定义的函数中遇到了错误,该错误使你基本上无法在制作角色后花费技能点。最初,错误表明我正在尝试从代码的这一部分的整数中减去一个字符串。显然这是错误的,所以我用… 修复了它,但是现在我遇到了一个以前从未见过的错误(新程序员),并且我对确切要告诉我的内容以及如何解决它感到困惑。 这是我的部分功能不起作用的代码: 这是我在shell中获得这部分代码时遇到的错误: 有

  • 问题内容: 我在SO上看到许多问题,询问将XML转换为JSON的方法,但我对采用其他方法感兴趣。是否有用于将JSON转换为XML的python库? 编辑: 什么都没有马上回来,所以我继续写了一个脚本来解决这个问题。 Python已经允许您将JSON转换为本地dict(使用或在版本2.6以下的中,),因此我编写了一个库,可将本地dict 转换为XML字符串。 https://github.com/q

  • 问题内容: 我需要传递一个可以使用转换的对象。查询如下所示: 为了传递可以转换为json的HttpResponse对象,我从这里需要做什么? 问题答案: 好吧,如果您只是这样做: 你会得到一个数组数组… 另一种方法是使用: 这将为您提供一个带有索引的json对象… 如果那不是您想要的,那么您需要指定结果的显示方式…

  • 问题内容: 我有一个从代码生成的点文件,想要在输出中呈现它。为此,我在网上看到命令是这样的 但是我的问题是我想在我的python程序中使用此内置函数。 我该怎么办? 我看着pydot,但似乎找不到答案。 问题答案: pydot无论如何都需要安装GraphViz二进制文件,因此,如果您已经生成了点文件,则不妨直接自己直接调用点。例如:

  • 问题内容: 如何将int(秒数)转换为mm:ss或hh:mm:ss格式? 我需要使用Python代码(如果可能,请在Django模板中)执行此操作。 问题答案: 我不敢相信众多答案中的任何一个都可以提供我认为的“一种明显的方法”(而且我什至都不是荷兰人!秒(特别是86399秒): 由于time过滤器支持时髦的时间格式语法(我相信是从PHP启发而来的),并且还需要datetime模块和时区实现(例如