如何将字典保存到文件中,保持良好的格式?

时间:2016-03-19 00:17:11

标签: python file dictionary save output

如果我有字典:

{
  "cats": {
           "sphinx": 3,
           "british": 2
          },
  "dogs": {}
}

并尝试将其保存到文本文件中,我得到这样的结果:

{"cats": {"sphinx": 3}, {"british": 2}, "dogs": {}}

如何以漂亮的格式保存字典,因此人眼很容易阅读?

4 个答案:

答案 0 :(得分:5)

您可以导入json并指定缩进级别:

import json

d = {
  "cats": {
           "sphinx": 3,
           "british": 2
          },
  "dogs": {}
}

j = json.dumps(d, indent=4)
print(j)
{
    "cats": {
        "sphinx": 3, 
        "british": 2
    }, 
    "dogs": {}
}

请注意,这是一个字符串,但是:

>>> j
'{\n    "cats": {\n        "sphinx": 3, \n        "british": 2\n    }, \n    "dogs": {}\n}'

答案 1 :(得分:3)

如果你想以更标准的格式保存它,你也可以使用yaml文件(以及相关的python包http://pyyaml.org/wiki/PyYAMLDocumentation),代码如下:

import yaml
dictionary = {"cats": {"sphinx": 3}, {"british": 2}, "dogs": {}}
with open('dictionary_file.yml', 'w') as yaml_file:
     yaml.dump(dictionary, stream=yaml_file, default_flow_style=False)

dump创建一个yaml格式的字符串以写入该文件。请注意,可以指定流并立即将内容写入文件。如果在写入文件之前由于某种原因需要获取字符串,则不要指定它并在使用write函数后对其进行写入。 另请注意,参数default_flow_style允许具有更好的格式;在示例中文件看起来:

cats:
  british: 2
  sphinx: 3
dogs: {}

再次在字典中加载yaml文件:

import yaml
with open('dictionary_file.yml', 'r') as yaml_file:
    dictionary = yaml.load(yaml_file)

答案 2 :(得分:2)

您可以使用pprint

const jackets = {[parent]: responses}
console.log(jackets)

// gives

{"jackets":[{"color":"red","size":"medium"}]}

答案 3 :(得分:0)

您可以使用Python Object Notation模块(pon转储它:免责声明我是该模块的作者)

from pon import PON, loads

data = {
    "cats": {
        "sphinx": 3,
        "british": 2
        },
    "dogs": {}
}

pon = PON(obj=data)
pon.dump()

给出:

dict(
    cats=dict(
        sphinx=3,
        british=2,
    ),
    dogs=dict(    ),
)

这也是正确的Python,但是使用dict来交换密钥所需的引用字符串。

您可以使用以下命令重新加载:

read_back = loads(open('file_name.pon').read())
print(read_back)

,并提供:

{'cats': {'sphinx': 3, 'british': 2}, 'dogs': {}}

请注意loads() 评估字符串,它实际上使用python的内置解析器安全地解析它。

PON还允许您从文件加载python词典,这些文件具有注释条目,并在保留注释的同时转储它们。这就是它真正有用的地方。

或者,如果你想要一些像YAML格式一样更具可读性的东西,你可以使用ruamel.yaml并执行:

import ruamel.yaml
ruamel.yaml.round_trip_dump(data, stream=open('file_name.yaml', 'wb'), indent=4) 

,它为您提供了一个文件file_name.yaml,内容为:

cats:
    sphinx: 3
    british: 2
dogs: {}

使用您似乎更喜欢的缩进(并且比@ alberto' s版本更有效)