【问题标题】:How to dump json without quotes in python如何在python中转储不带引号的json
【发布时间】:2014-10-26 00:56:46
【问题描述】:

这是我转储文件的方式

with open('es_hosts.json', 'w') as fp:
  json.dump(','.join(host_list.keys()), fp)

结果是

 "a,b,c"

我想要:

 a,b,c

谢谢

【问题讨论】:

  • 是什么让你认为你想要的输出是有效的 JSON?为什么不需要引号?
  • 我知道......但是在我不需要输出中的引号的极端情况下
  • @MartijnPieters OP 并未建议将未加引号的字符串直接用作 JSON。我最近遇到了类似的情况,在这个过程中稍后会添加双引号,所以我需要未加引号但 JSON 转义的字符串。
  • @AndreasMaier:情况完全不同。
  • 如果你想读取一个 json 文件并将它的一部分转储到磁盘(即:保存它而不保存的文件是 json),那么使用write 可能比使用dump 更有意义,例如fp.write(mydata).

标签: python json python-2.7


【解决方案1】:

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

print '"a,b,c"'.strip('"')

输出:

a,b,c

这更接近您想要实现的目标。即使只是删除第一个和最后一个字符也可以:'"a,b,c"'[1:-1]

但是你看过this question吗?

【讨论】:

  • 此解决方案比建议替换所有双引号的解决方案要好,但是当(未加引号的)字符串的最后一个字符是(转义的)双引号时,它仍然删除了太多,如@ 987654326@。您想要的是仅删除前导双引号和尾随双引号。
  • 我应该补充一点,我的评论适用于答案中建议的第一个解决方案(使用strip())。第二种解决方案(使用切片)适用于所有情况(并且应该有自己的答案,因此可以投票)。仍在投票赞成这个答案。
【解决方案2】:

仅删除 keys 中的引号,如果您稍后对其进行解析,这可能很重要(可能使用一些宽容的解析器,或者您可能出于奇怪的原因将其直接通过管道传递到 node ),你可以试试下面的正则表达式。

re.sub(r'(?<!: )"(\S*?)"', '\\1', json_string)

一个问题是这个正则表达式期望字段被分隔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)

会引发ValueError,但会打印您想要的内容。

【讨论】:

    【解决方案3】:

    嗯,这不是有效的 json,所以 json 模块不会帮助您编写该数据。但你可以这样做:

    import json
    
    with open('es_hosts.json', 'w') as fp:
        data = ['a', 'b', 'c']
        fp.write(json.dumps(','.join(data)).replace('"', ''))
    

    那是因为你要求json,但既然那不是json,这就足够了:

    with open('es_hosts.json', 'w') as fp:
        data = ['a', 'b', 'c']
        fp.write(','.join(data))
    

    【讨论】:

      【解决方案4】:

      使用python内置的字符串替换功能

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

      【讨论】:

      • 此解决方案也删除了字符串中的双引号。
      【解决方案5】:

      只需使用 for 循环将列表分配给字符串。

      import json
      
      with open('json_file') as f:
          data = json.loads(f.read())
          for value_wo_bracket in data['key_name']:
              print(value_wo_bracket)
      

      注意json.loadjson.loads 之间的区别

      【讨论】:

        猜你喜欢
        • 2019-01-16
        • 2021-10-11
        • 2017-12-01
        • 1970-01-01
        • 2013-09-09
        • 2021-05-13
        • 2018-12-02
        • 2019-08-09
        • 2018-11-04
        相关资源
        最近更新 更多