python yaml.dump()中的强制缩进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python yaml.dump()中的强制缩进相关的知识,希望对你有一定的参考价值。

编写了一些python(3.7)代码以将json转储到yaml并将结果插入到另一个yaml代码中,例如:

sample_code = '''
A :
  - DATA_A

B :
  C :
    
'''

import yaml

json_code =  'json' :  D: VALUE_D, E: VALUE_E  
sample_code.format( yaml.dump(json_code) )

将格式化的代码写入文件后,我得到了:

A :
  - DATA_A
B :
  C :
    json :
  D : VALUE_D
  E : VALUE_E

我想得到类似的结果:

A :
  - DATA_A
B :
  C :
    json :
      D : VALUE_D
      E : VALUE_E

我刚刚使用了无形状方法:

json_code_dumped = yaml.dump(json_code).replace("  ", "          ")
samplecode.format( json_code_dumped )

并且无论如何现在都有效。有没有更聪明的方法可以这样做?

谢谢。

答案

正确的方法是将整个YAML数据作为内存数据加载并在其中插入JSON数据。这保证了转储将产生有效的YAML。

现在有多种方法可以解决此问题。这是最简单的一个:

import yaml

sample_code = '''
A :
  - DATA_A

B :
  C : 
'''

data = yaml.safe_load(sample_code)
data["B"]["C"]["json"] =  "D": "VALUE_D", "E": "VALUE_E" 
print(yaml.dump(data))

[现在被解释为空映射,因为它已加载YAML。这就是为什么您可以在其中插入"json"键的原因。输出看起来像这样:

A:
- DATA_A
B:
  C:
    json:
      D: VALUE_D
      E: VALUE_E

格式更改,因为YAML不会保留格式(有关详细信息,请参见this question


显示了一种更复杂的方法,它回答了this question,该方法使用了低级事件API,因此可以让您指定要插入的位置(字符串列表),并且可以指定所需的标量格式。更多详情。但是,它要复杂得多,并且要求您提供其他数据作为YAML事件。但是,如果您有实际的JSON输入,则可以将其加载到YAML事件,因为YAML是JSON的超集。


这是第三种方法,可让您像目前一样在YAML文件中指定占位符:

from yaml.loader import SafeLoader
import yaml

class MyLoader(SafeLoader):
  def __init__(self, stream):
    SafeLoader.__init__(self, stream)
    self.replacements = []

def replace_placeholder(loader, node):
  index = int(loader.construct_scalar(node))
  return loader.replacements[index]

MyLoader.add_constructor('!placeholder', replace_placeholder)


sample_code = '''
A :
  - DATA_A

B :
  C : !placeholder 0
'''

loader = MyLoader(sample_code)
loader.replacements.append(
   'json' :  'D': 'VALUE_D', 'E': 'VALUE_E' )
print(yaml.dump(loader.get_single_data()))

非常类似于format,您在YAML文件中有一个占位符,该占位符由本地标签!placeholder标识。我给它一个数字,表明您可以有多个占位符。您将要替换占位符的数据放入loader.s replacements,然后在加载期间,我们的自定义构造函数将用实际数据替换占位符。结果与第一种方法相同。

以上是关于python yaml.dump()中的强制缩进的主要内容,如果未能解决你的问题,请参考以下文章

Python之ruamel.yaml模块详解

yaml.load与yaml.dump的用法

python中使用rumel.yaml写入文件时,中文不乱码的方式以及转换后格式正确

了解 YAML 文件与数据配置

如何在 python yaml 文件中输出空白值

使用 SnakeYaml 将 java 对象写入文件 - 使用 Yaml.dump() 时不会写出内部对象列表