在python

时间:2018-02-22 12:27:35

标签: python

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

CVS文件格式

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

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

datareader = csv.reader(csvfile, delimiter=',', quotechar='"')
data_headings = []
for i in datareader:
    new_yaml = open('hosts', 'a')
    yaml_text = ""
    #heading = "["+i[0]+"]"
    #new_yaml.write(heading)
    new_yaml.write('\n')
    for cell in i:
        print cell
        new_yaml.write(cell)
        new_yaml.write('\n')
    new_yaml.close()
csvfile.close()

我得到低于输出,这对我来说很好。

CASSANDRA
a
a
DSE_OPSCENTER
IGNITE
a
KAFKA_LEAD
KAFKA_SMART
...

我想在这里把CASSANDRA,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,
                )
            )

1 个答案:

答案 0 :(得分:0)

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

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

import ruamel.yaml

yaml = ruamel.yaml.YAML()

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

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

如果您想在YAML文件中使用单个多行字符串,则最好使用块样式文字标量。这是正确的YAML:

|
[CASSANDRA]
a
a
[DSE_OPSCENTER]
...

如果您不想冒创建无效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转储为块样式文字标量的内容。