我在配置文件夹中有一堆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
有人可以向我发出正确的方向吗?
答案 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
当然,有很多方法可以使这更复杂,比如使用合适的模板引擎。