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()中的强制缩进的主要内容,如果未能解决你的问题,请参考以下文章