使用模板引擎生成代码(文本)

时间:2017-03-07 05:02:19

标签: python template-engine cheetah

我在配置文件夹中有一堆YAML文件,模板文件夹中有一堆模板。我的用例是基于yaml配置和模板生成文本文件。我想看看是否可以使用python诱人引擎来解决这个问题。

我看到模板引擎用于Web开发上下文。我的用例非常相似(但不相同)。我想生成一些文字。它不需要显示在网页上。相反,它应该只生成一个文本文件。

实施例     输入:     config文件夹:config / yaml1,config / yaml2,config / yaml3 ..     模板:template / template1,template / template2,template3。

输出

scripts/script1, script2, script3

脚本数量=模板数量

有两种类型的模板

一个直接/直接替代的例子

YAML1:
    Titles:4
    SubTitles:10
Template1:
Number of Titles {Titles} where as Number of Subtitles is {SubTitles}

其他模板是嵌套模板。基本上,模板需要基于YAML示例循环:

    YAML2:
        Book: "The Choice of using Choice"
            Author: "Unknown1"
        Book: "Chasing Choices"
            Author:"Known2"

Template2
Here are all the Books with Author Info
The author of the {Book} is {Author}

预期输出是具有

的单个文本文件

标题数量4,其中字幕数为10 使用选择的选择的作者是未知的1 追逐选择的作者已知2

有人可以向我发出正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式和搜索/替换来执行此操作。您可以将函数而不是字符串传递给re.sub函数。当然,它依赖于有效的YAML:

YAML1:
    Titles: 4
    #      ^ need space here
    SubTitles: 10
Template1:
    Number of Titles {Titles} where as Number of Subtitles is {SubTitles}
    # Need indentation here

python代码如下所示:

import re
import yaml

# Match either {var}, {{, or }}
TEMPLATE_CODE = re.compile(r'\{(\w+)\}|\{\{|\}\}')

def expand(tmpl, namespace):
    print(namespace)
    def repl(m):
        name = m.group(1)
        if name:
            # Matched {var}
            return str(namespace[name])
        # matched {{ or }}
        return m.group(0)[0]
    return TEMPLATE_CODE.sub(repl, tmpl)

def expand_file(path):
    with open(path) as fp:
        data = yaml.safe_load(fp)
    print(expand(data['Template1'], data['YAML1']))

这是输出:

Number of Titles 4 where as Number of Subtitles is 10

当然,有很多方法可以使这更复杂,比如使用合适的模板引擎。