如何移除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
相关产品推荐
相关产品推荐

