python Jinja2使用yaml conf从json模板创建文件

时间:2016-03-29 18:55:50

标签: python python-2.7 python-3.x yaml jinja2

我正在编写一个使用yaml配置文件渲染json模板的函数。

看起来如下所示:

render.py

if len(sys.argv) != 3:
    print "usage: python render_template.py [yaml_file] [jinja_template_file]"
    sys.exit(1)

with open(sys.argv[1], "r") as stream:
    config = yaml.safe_load(stream)
with open(sys.argv[2], "r") as stream:
    template_text = stream.read()
template = Template(template_text)

print template.render(config)

test.yaml

    Application:
          Hosts:
              - a
              - b

sample.json.templete

     [{
"test1": 
{

                  "objectName": "{{Application.Hosts}}",

                 }


}]

当我跑

   python ./render.py ./test.yaml ./sample.json.templete > sample.json

我得到了

   [{
"test1": 
{

                  "objectName": ['a' , 'b'],

                 }


}]

但由于我正在生成一个json文件,我需要

     ["a", "b"]

即。我希望列表用双引号。我如何最好地实现它?如何将带有单引号字符串的列表转换为带双引号字符串的列表?

2 个答案:

答案 0 :(得分:0)

您可以在模板中使用自定义过滤器功能,以您希望的方式格式化列表。然后,您可以将此功能用于要格式化的任何列表。

一个很好的SO问题/答案,其中包含一些有关创建jinja2过滤器以便与可迭代使用的精彩信息(例如您的列表)is available here

然后你的json模板可以像这样使用过滤器:

    "objectName": "{{ Application.Hosts|format_list }}",

您的过滤器很可能会执行以下操作:

def format_list(my_list):
    formatted_list = ", ".join(["%s" % item for item in my_list]) 
    return "[%s]" % formatted_list

答案 1 :(得分:0)

这样可行

["{{Application.Hosts|join('","')}}"]

我们不需要制作任何自定义过滤器