Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 漂亮的打印JSON转储_Python_Json_Dictionary_Python 2.x_Dump - Fatal编程技术网

Python 漂亮的打印JSON转储

Python 漂亮的打印JSON转储,python,json,dictionary,python-2.x,dump,Python,Json,Dictionary,Python 2.x,Dump,我使用此代码将dict漂亮地打印成JSON: import json d = {'a': 'blah', 'b': 'foo', 'c': [1,2,3]} print json.dumps(d, indent = 2, separators=(',', ': ')) 输出: { "a": "blah", "c": [ 1, 2, 3 ], "b": "foo" } { "a": "blah", "c": [1, 2, 3], "b": "

我使用此代码将
dict
漂亮地打印成JSON:

import json
d = {'a': 'blah', 'b': 'foo', 'c': [1,2,3]}
print json.dumps(d, indent = 2, separators=(',', ': '))
输出:

{
  "a": "blah",
  "c": [
    1,
    2,
    3
  ],
  "b": "foo"
}
{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}
这有点太多了(每个列表元素换行!)

我应该使用哪种语法来实现这一点:

{
  "a": "blah",
  "c": [
    1,
    2,
    3
  ],
  "b": "foo"
}
{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}

相反?编写自己的JSON序列化程序:

import numpy

INDENT = 3
SPACE = " "
NEWLINE = "\n"

def to_json(o, level=0):
    ret = ""
    if isinstance(o, dict):
        ret += "{" + NEWLINE
        comma = ""
        for k,v in o.iteritems():
            ret += comma
            comma = ",\n"
            ret += SPACE * INDENT * (level+1)
            ret += '"' + str(k) + '":' + SPACE
            ret += to_json(v, level + 1)

        ret += NEWLINE + SPACE * INDENT * level + "}"
    elif isinstance(o, basestring):
        ret += '"' + o + '"'
    elif isinstance(o, list):
        ret += "[" + ",".join([to_json(e, level+1) for e in o]) + "]"
    elif isinstance(o, bool):
        ret += "true" if o else "false"
    elif isinstance(o, int):
        ret += str(o)
    elif isinstance(o, float):
        ret += '%.7g' % o
    elif isinstance(o, numpy.ndarray) and numpy.issubdtype(o.dtype, numpy.integer):
        ret += "[" + ','.join(map(str, o.flatten().tolist())) + "]"
    elif isinstance(o, numpy.ndarray) and numpy.issubdtype(o.dtype, numpy.inexact):
        ret += "[" + ','.join(map(lambda x: '%.7g' % x, o.flatten().tolist())) + "]"
    else:
        raise TypeError("Unknown type '%s' for json serialization" % str(type(o)))
    return ret

inputJson = {'a': 'blah', 'b': 'foo', 'c': [1,2,3]}
print to_json(inputJson)
输出:

{
   "a": "blah",
   "c": [1,2,3],
   "b": "foo"
}
{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}
{'a': 'blah',  
 'b': 'foo',  
 'c': [1, 2, 3]}


也许不太有效,但是考虑一个更简单的情况(在Python 3中进行了一些测试,但也可能在Python 2中进行):


除了完全编写自己的序列化程序之外,这可能会给您一些想法。我使用了我自己最喜欢的缩进技术和硬编码的ascii,但是你可以添加参数并传递它们,或者硬编码你自己的,等等。

另一种选择是打印(json.dumps(d,缩进=无,分隔符=(',\n',':'))

输出将是:

{"a": "blah",
"c": [1,
2,
3],
"b": "foo"}

请注意,尽管官方文档中的默认参数是
separators=None
——但这实际上意味着“使用
separators=(',',':'的默认值”)
)。还要注意,逗号分隔符不区分k/v对和列表元素。

这也困扰了我一段时间,我找到了一个我几乎满意的1行:

print json.dumps(eval(str(d).replace('[', '"[').replace(']', ']"').replace('(', '"(').replace(')', ')"')), indent=2).replace('\"\\"[', '[').replace(']\\"\"', ']').replace('\"\\"(', '(').replace(')\\"\"', ')')
这实际上是将所有列表或元组转换为字符串,然后使用带有缩进的json.dumps来格式化dict。然后,您只需删除引号并完成

注意:我将dict转换为字符串,以便轻松地转换所有列表/元组,而不管dict的嵌套程度如何

另外,我希望Python警察不会因为我使用eval…(小心使用)

我最终使用了:

输出:

{
   "a": "blah",
   "c": [1,2,3],
   "b": "foo"
}
{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}
{'a': 'blah',  
 'b': 'foo',  
 'c': [1, 2, 3]}


多年后,我找到了一个内置
pprint
模块的解决方案:

import pprint
d = {'a': 'blah', 'b': 'foo', 'c': [1,2,3]}
pprint.pprint(d)                    # default width=80 so this will be printed in a single line
pprint.pprint(d, width=20)          # here it will be wrapped exactly as expected
输出:

{
   "a": "blah",
   "c": [1,2,3],
   "b": "foo"
}
{
  "a": "blah",
  "c": [1, 2, 3],
  "b": "foo"
}
{'a': 'blah',  
 'b': 'foo',  
 'c': [1, 2, 3]}


我不能让jsbeautifier做很多事情,所以我使用正则表达式

'{\n    "string": [\n        4,\n        1.0,\n        6,\n        1.0,\n        8,\n        1.0,\n        9,\n        1.0\n    ],\n...'
那是我想要的

'{\n    "string": [ 4, 1.0, 6, 1.0, 8, 1.0, 9, 1.0],\n'
所以

t=json.dumps(apriori,indent=4)
t=re.sub('\[\n{7}','[',t)

t=re.sub(“(?这并不是你问题的答案,但如果你只是想寻找一种简单易懂的数据格式,你可以试试YAML。集合有两种语法,比如列表和字典,“block”(缩进表示嵌套)和“flow”(括号表示嵌套)。默认情况下,PyYAML的输出使用”不包含任何其他容器的列表和字典的“flow”语法,这听起来正是您想要的漂亮打印。谢谢@Blckknght。YAML是否成熟/稳定/可移植,并且可能在python的未来几年/未来版本中可用?它是否将成为一个标准?(对于所有这些问题,抱歉;)另一句话:我想避免转换成字符串,因为当我
将我的JSON文件加载到
dict
中时,如果它是字符串,我就不能再访问
列表了(或者我需要将字符串解析成列表,但不得不这样做是很遗憾的…)必须有一种方法通过子类化来做到这一点,但我还没有弄明白。@Basj:我不是真正的YAML专家,但我的理解是它非常稳定和成熟,尽管没有JSON广泛使用。你可以在上找到它的标准,尽管在提供概述方面似乎更好一些。JSON是最新版本的一个子集YAML(显然很少遇到与早期YAML版本不兼容的情况)。真的有那么复杂吗?WowI预计会有10行左右。我猜我被宠坏了!@Basj,我只知道两种方法:编写自己的序列化程序,如上面所述或子类,并自定义JSON编码器本身(如中所述)我认为这比前者更痛苦!您的序列化程序似乎工作得相当好,尽管它可能还应该将
None
s转换为
'null'
s。@someDoge,我认为'pprint'只允许您自定义缩进、宽度和深度,而不允许您自定义何时吐新行等;因此,定制序列化程序。谢谢,但这并不完全是我们所需要的;我们希望将
[1,2,3]
放在一行中,而不是说,它并不完美,但与其他怪物相比,它是精益和卑鄙的。。)如果我喜欢,我会使用Tnx作为分隔符,帮助我实现lua兼容性。在lua中,不允许有空格。这不一定是有效的JSON,这是一个打印精美的Python字典,通常是有效的JSON。@Anonymous你是对的,但请注意我的问题是关于打印精美,而不是关于成为一个有效的JSON字符串。欢迎@ChrisChang加入StackOverflow!这看起来更像是一个新问题,而不是对这个实际问题的回答。你能把它作为一个问题发布吗?嗨@Basj,谢谢。这是对根问题的回答(漂亮的打印JSON转储),但我引用的是Allen Z关于jsbeautifier的帖子。也许我应该把回应与他的答案放在一起,但关于jsbeautifier的评论是无关紧要的。