You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python为.erb及JSON模板文件插入变量?

解答

首先给你明确几个核心点:

  1. 你的需求完全可以实现,不需要将文件转为.txt格式——.html.erb和.json本质都是纯文本文件,直接读取、编辑后保存回原格式即可,后缀只是标识,不影响内容处理。
  2. 你当前用的多次.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:40:41