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

如何移除Jinja2内部代码块的缩进(而非仅整行缩进)?

如何移除Jinja2内部代码块的缩进(而非仅整行缩进)?

我完全懂你的需求——既要保持Python代码里的模板缩进让代码结构清晰易读,又要让最终输出的M3U文件没有多余的缩进。textwrap.dedent()确实能处理外层的整体缩进,但循环内部的行因为在代码里做了缩进,输出时就会带着多余的空格。这里有两个简单的解决办法:

  • 方法1:配置Jinja模板的lstrip_blocks参数
    这是最省心的方案,只需要在创建Template对象时添加lstrip_blocks=True参数(搭配trim_blocks=True还能移除块标签后的换行,不过根据你的输出需求,单独用lstrip_blocks就足够)。

修改后的代码如下:

M3U_TEMPLATE = jinja2.Template(
    textwrap.dedent("""\
        #EXTM3U
        
        {% for item in playlist %}
            #EXTALB:{{ item.strAlbum }} ({{ item.release }})
            #EXTART:{{ item.strAlbumArtists }}
            #EXTINF:{{ item.iDuration }},{{ item.strArtists }} - {{ item.strTitle }}
            {{ item.path }}
        {% endfor %}
    """),
    lstrip_blocks=True
)

lstrip_blocks=True的作用是让Jinja自动移除块标签(比如{% for %})后续行首的所有空白,这样循环内部的缩进就会被完全去掉,输出就是你想要的顶格格式,同时Python代码里的模板缩进依然保留,完全不影响可读性。

  • 方法2:手动添加空白控制符号-
    如果你不想全局修改模板参数,也可以在循环内的每一行开头用{%- %}来吃掉前面的空白,不过这个方法需要修改模板的每一行,相对繁琐:
M3U_TEMPLATE = jinja2.Template(
    textwrap.dedent("""\
        #EXTM3U
        
        {% for item in playlist %}
{%- %}            #EXTALB:{{ item.strAlbum }} ({{ item.release }})
{%- %}            #EXTART:{{ item.strAlbumArtists }}
{%- %}            #EXTINF:{{ item.iDuration }},{{ item.strArtists }} - {{ item.strTitle }}
{%- %}            {{ item.path }}
        {% endfor %}
    """)
)

显然方法1更简洁高效,完全匹配你的需求。测试后你会发现,输出的M3U文件会和你期望的完全一致:循环内的内容全部顶格,没有多余缩进,同时代码的可读性也没打折扣。

备注:内容来源于stack exchange,提问作者avibrazil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:29:31