在python中创建yaml时将变量括在括号中

2024-06-02 06:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的csv文件格式,我需要转换成yaml。(或下面的示例输出)

CVS文件格式

CASSANDRA   a   a
DSE_OPSCENTER       
IGNITE  a   
KAFKA_LEAD      b
KAFKA_SMART     
OAM     
RBM a   

我使用下面的代码将文件转换为预期的输出

^{pr2}$

我得到的输出量低于输出值,这对我来说很好。在

CASSANDRA
a
a
DSE_OPSCENTER
IGNITE
a
KAFKA_LEAD
KAFKA_SMART
...

我需要一个小的帮助,在这里把卡桑德拉,DSE_OPSCENTER等等放在方括号内。像下面这样的东西

[CASSANDRA]
a
a 
[DSE_OPSCENTER]
...

编辑

我添加了一个模板格式。但我不知道如何将价值观放在他们各自的群体中

HOST_VAR_TEMPLATE = """
[CASSANDRA]
{cell}

[DSE_OPSCENTER]

[SMART]


[SPARK]


[SPARK_MASTERS]


[ZK]
"""

csvfile = open('hosts.csv', 'r')

datareader = csv.reader(csvfile, delimiter=',', quotechar='"')

data_headings = []

for i in datareader:
    print i[1:]
    with open('hosts', "w") as f:
        for cell in i:
            print cell
            f.write(
                HOST_VAR_TEMPLATE.format(
                    cell=cell,
                )
            )

Tags: kafkacsvcsvfilehostsmartvarcelltemplate
1条回答
网友
1楼 · 发布于 2024-06-02 06:35:05

您正在创建一个文件,其中包含一个多行标量字符串,后跟一个显式的文档结束标记。 您尝试自己编写文件,而不是使用YAML库。原则上这是可能的,但有些情况下你必须特别小心。在

您应该首先使用YAML库加载最终结果:

import ruamel.yaml

yaml = ruamel.yaml.YAML()

data = yaml.load("""\
[CASSANDRA]
a
a
[DSE_OPSCENTER]
...
""")

这将给您一个ComposerError,告诉您a(第一个)开始一个新文档。这是因为从[开始,解析器假设文档由单个流样式序列组成,一旦遇到相应的],文档就完成了。在

如果你想在YAML文件中有一个多行的字符串,最好使用块样式的文本标量。这是正确的

^{pr2}$

如果您不想冒创建无效YAML文件的风险,请创建一个Python字符串变量data,并将每一行(包括新行)附加到它,然后使用YAML库将其写入文件:

import sys
import ruamel.yaml

from ruamel.yaml.scalarstring import PreservedScalarString

yaml = ruamel.yaml.YAML()
yaml.explicit_end = True


data = ''
data += '[CASSANDRA]' + '\n'
data += 'a' + '\n'
data += 'a' + '\n'
data  += '[DSE_OPSCENTER]' + '\n'

yaml.dump(PreservedScalarString(data), sys.stdout)

PreservedScalarString类型将多行Python字符串包装成ruamel.yaml转储为块样式的文本标量。在

相关问题 更多 >