无法使用Template模块替换python字符串

时间:2016-08-05 22:04:34

标签: python

我正在尝试使用python Template模块替换以下内容。

start_date BETWEEN DATEADD(days,-14,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM-DD}'

我正在使用ConfigParser读取值并将其存储到我能够成功完成的字典(config_params)中。然后我做了一个安全的替代品来代替上面的模板,但似乎没有做任何事情。它取代了文件中的许多其他参数,但似乎没有替换$ {DATE_YYYY-MM-DD}

我正在使用的代码如下:

with open(templateFile, 'r+') as f:
    temp = Template(f.read())
    resultFile = temp.safe_substitute(config_params)

有关为何发生这种情况的任何帮助?这是不喜欢的()吗?

TemplateFile:

SELECT
x
,y
,z
,a
,b
INTO ${od}.${tab}
FROM
mphd.${pd} as h
WHERE
a BETWEEN DATEADD(month,-12,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM-    DD}'
;

配置文件:

[GeneralParams]
od = sandbox
tab = abcd
pd = hierarchy_expanded
DATE_YYYY-MM-DD = 2016-08-05

config_params:

{'od': 'sandbox', 'DATE_YYYY-MM-DD': '2016-08-05', 'pd': 'hierarchy_expanded', 'tab': 'abcd'}

结果文件:

SELECT
x
,y
,z
,a
,b
INTO sandbox.abcd
FROM
mphd.hierarchy_expanded as h
WHERE
a BETWEEN DATEADD(month,-12,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM- DD}'
;

1 个答案:

答案 0 :(得分:1)

根据the doc,标识符应遵循的默认模式为:[_a-z][_a-z0-9]*。使用substitute代替safe_substitute会对此发出警告。

但是,您可以通过创建新的模板类来解决这个问题:

class MyTemplate(Template):
    idpattern = '[_a-z][_a-z0-9-]*' # Note the extra -

然后我们在您的代码中使用MyTemplate(或任何您想要命名的内容)而不是Template)。