如何在python中不带引号转储json

Tam*_*mpa 7 python json python-2.7

这是我如何转储文件

with open('es_hosts.json', 'w') as fp:
  json.dump(','.join(host_list.keys()), fp)
Run Code Online (Sandbox Code Playgroud)

结果是

 "a,b,c"
Run Code Online (Sandbox Code Playgroud)

我想要:

 a,b,c
Run Code Online (Sandbox Code Playgroud)

谢谢

Fal*_*lko 7

在进行字符串替换之前,您可能需要strip将引号引起来:

print '"a,b,c"'.strip('"')
Run Code Online (Sandbox Code Playgroud)

输出:

a,b,c
Run Code Online (Sandbox Code Playgroud)

这更接近您想要实现的目标。哪怕只是除去第一和最后一个字符的作品:'"a,b,c"'[1:-1]

但是你有没有研究这个问题


szm*_*ore 6

要仅删除中的引号,这在您稍后解析时可能很重要(大概是使用一些宽容的解析器,或者您可能node出于奇怪的原因直接将其输入),您可以尝试以下正则表达式。

re.sub(r'(?<!: )"(\S*?)"', '\\1', json_string)
Run Code Online (Sandbox Code Playgroud)

一个问题是这个正则表达式期望字段被分离key: value,并且它将失败key:value. 您可以通过稍作更改使其适用于后者,但同样地,它不适用于可变数量的空格之后:

可能还有其他边缘情况,但它适用于 的输出json.dumps,但是结果将无法被 json 解析。一些更宽容的解析器yaml可能能够读取结果。

import re
regex = r'(?<!: )"(\S*?)"'
o = {"noquotes" : 127, "put quotes here" : "and here", "but_not" : "there"}
s = json.dumps(o)
s2 = json.dumps(o, indent=3)
strip_s = re.sub(regex,'\\1',s)
strip_s2 = re.sub(regex,'\\1',s2)

print(strip_s)
print(strip_s2)

assert(json.loads(strip_s) == json.loads(s) == json.loads(strip_s2) == json.loads(s2) == object)
Run Code Online (Sandbox Code Playgroud)

将提高 aValueError但打印你想要的。


Jef*_*eld 1

使用python内置的字符串替换函数

with open('es_hosts.json', 'w') as fp:
   json.dump(','.join(host_list.keys()).replace('\"',''), fp)
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案也会删除字符串中的双引号。 (3认同)