我有以下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,
)
)
答案 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
转储为块样式文字标量的内容。