如何用Python为.erb及JSON模板文件插入变量?
解答
首先给你明确几个核心点:
- 你的需求完全可以实现,不需要将文件转为.txt格式——
.html.erb和.json本质都是纯文本文件,直接读取、编辑后保存回原格式即可,后缀只是标识,不影响内容处理。 - 你当前用的多次
.replace()方法仅适合极简单场景,变量多了会繁琐且容易出错,下面是几种更优的实现方式:
方案1:用Python标准库string.Template(轻量无依赖)
这是Python自带的模板工具,语法和你现在的{{ py_name }}类似,换成$py_name或${py_name}即可,一次替换所有变量,比手动调用多次replace简洁:
代码示例
from string import Template # 定义变量 py_name = "John Doe" py_path = "/john-doe" template_vars = {"py_name": py_name, "py_path": py_path} # 处理page.json模板 with open("page.json", "r", encoding="utf-8") as f: json_content = f.read() updated_json = Template(json_content).substitute(template_vars) with open("page.json", "w", encoding="utf-8") as f: f.write(updated_json) # 处理body.html.erb模板 with open("body.html.erb", "r", encoding="utf-8") as f: erb_content = f.read() updated_erb = Template(erb_content).substitute(template_vars) with open("body.html.erb", "w", encoding="utf-8") as f: f.write(updated_erb)
模板修改
把模板里的标记换成$py_name:
page.json模板:
{ "name": "$py_name", "path": "$py_path" }
body.html.erb模板:
<% pame = $py_name %> <% path = $py_path %>
方案2:针对JSON文件,直接操作JSON对象(更安全)
如果page.json的结构固定,直接解析成Python字典修改值,再转回JSON写入,能避免字符串替换可能导致的格式错误(比如变量含特殊字符破坏JSON结构):
代码示例
import json py_name = "John Doe" py_path = "/john-doe" # 读取并修改JSON with open("page.json", "r", encoding="utf-8") as f: json_data = json.load(f) json_data["name"] = py_name json_data["path"] = py_path # 写入回文件(indent=4保持原格式缩进) with open("page.json", "w", encoding="utf-8") as f: json.dump(json_data, f, indent=4)
这种方式不需要在JSON里加任何标记,直接修改原JSON的对应键值即可,是处理JSON文件的最佳实践。
方案3:用Jinja2模板引擎(复杂场景首选)
如果你后续需要添加条件判断、循环等复杂模板逻辑,或者变量数量较多,Jinja2是Python生态中最常用的模板工具,完美支持你现在用的{{ py_name }}语法,也能轻松处理大体积的.html.erb文件:
代码示例(需先安装:pip install jinja2)
from jinja2 import Environment, FileSystemLoader # 初始化模板环境,加载当前目录的模板文件 env = Environment(loader=FileSystemLoader(".")) template_vars = {"py_name": "John Doe", "py_path": "/john-doe"} # 处理body.html.erb erb_template = env.get_template("body.html.erb") updated_erb = erb_template.render(template_vars) with open("body.html.erb", "w", encoding="utf-8") as f: f.write(updated_erb) # 处理page.json json_template = env.get_template("page.json") updated_json = json_template.render(template_vars) with open("page.json", "w", encoding="utf-8") as f: f.write(updated_json)
模板里直接保留你现在的{{ py_name }}标记即可,无需修改,同时Jinja2支持更多高级功能,扩展性很强。
方案选择建议
- 只有少量简单变量替换:用
string.Template(无额外依赖,轻量快捷) - 处理JSON文件:优先用直接操作JSON对象的方式(安全,避免格式问题)
- 后续有复杂模板需求或变量较多:用Jinja2(功能强大,易维护)
内容的提问来源于stack exchange,提问作者solaphy
相关产品推荐
相关产品推荐

