jinja2如何删除尾随换行符

Posted

技术标签:

【中文标题】jinja2如何删除尾随换行符【英文标题】:jinja2 how to remove trailing newline 【发布时间】:2016-08-20 15:17:48 【问题描述】:

我正在使用 jinja 2 输出 yaml 文件,但似乎无法摆脱尾随换行符和 for 循环的结尾。例如下面的

 - request:
        path:  path 
        headers:
          origin: 'somedomain.com'
          user-agent: 'agent'
          referer: 'some.domain.com'
          authority: 'somedomain.com'
        querystring:
          % for key, value in querystring.items() -%
           key : ' value '
          % endfor %
      response:
        content:
          file:  content 

给我输出:

- request:
    path: /some/path
    headers:
      origin: 'somedomain.com'
      user-agent: 'agent'
      referer: 'somedomain.com'
      authority: 'somedomain.com'
    querystring:
      postcode: 'xxxxxx'
      houseNo: '55'

  response:
    content:
      file: address.json

在 houseNo 之后多了一个不需要的空行。如何摆脱这条线?

【问题讨论】:

【参考方案1】:

更改循环以从输出的顶部和底部去除空格(注意for 循环关闭处的额外-):

% for key, value in querystring.items() -%
   key : ' value '
%- endfor %

在我的测试中(使用https://github.com/abourguignon/jinja2-live-parser),- 必须在第一个 % 之后,而不是在最后一个之前才能达到您的要求。

文档:https://jinja.palletsprojects.com/en/latest/templates/#whitespace-control

【讨论】:

是的,你是对的。预先添加 - 而不是附加会保留缩进并且不会弄乱下一行中的空格。 正确,直到我再次玩弄它时才记得这个细节。 对我来说,这会将所有键:值对放在一行上。我不明白为什么这个答案被接受了。 只是因为我没有在任何地方看到这部分解释,我想我会添加它。在 for 循环的第一行的第二个百分号之前放置 - 会删除添加行之前的换行符。在 for 循环的最后一行的第一个百分号之后放置 - 会删除添加行之后的换行符。将它们结合起来,你会得到 0 个换行符。只有一个,你只能得到一个换行符来分隔一行,但每行之间没有额外的换行符。在我的例子中,我想在循环之前而不是在每个元素之后换行,所以我把-放在endfor之前。希望这会有所帮助【参考方案2】:

我认为您可以使用whitespace control 功能摆脱它。因此我会将endfor 块修改为% endfor -%

看看是不是这样!

【讨论】:

【参考方案3】:

对于那些到达这里的使用 Flask 的人来说,这些行对我有用:

app = Flask(__name__)
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True

【讨论】:

也许您可以通过说明您可以在 Environment 对象中设置它来使您的答案更通用:Environment(trim_blocks=True, lstrip_blocks=True)【参考方案4】:

我找到了解决这个问题的方法:

- request:
    path:  path 
    headers:
      origin: 'somedomain.com'
      user-agent: 'agent'
      referer: 'some.domain.com'
      authority: 'somedomain.com'
    querystring: >-
      % for key, value in querystring.items() -%
       key : ' value '
      % endfor %
  response:
    content:
      file:  content 
>, |: "clip": 保持换行,去掉尾随的空行。 >-, |=: "strip": 去掉换行,去掉尾随的空行。 >+, |+: "keep": 保持换行,保持尾随空行。

谢谢史蒂夫·贝内特的帖子: In YAML, how do I break a string over multiple lines?

【讨论】:

谢谢你,帮助我解决了我的问题,我必须使用的正确运算符是“|-”(管道减号),现在我的多行字符串已正确传输到我的 json 文件,除最后一行以外的所有行结束。【参考方案5】:

接受的答案只是解决方案的一半,因为它删除了所有个换行符。

您可以通过首先删除所有换行符来避免尾随换行符(在 for 循环中使用 -%%- 的减号),然后在正确的位置插入所需的换行符(使用 loop.last 条件)。

以下模板将字典 d 呈现为 JSON 文本:


    % for key, value in d.items() -%
    " key ": " value " ",
    " if not loop.last 
    %- endfor %

对于d = 'a':'1', 'b':'2',模板呈现为


    "a": "1",
    "b": "2"

【讨论】:

【参考方案6】:

您可以禁止渲染以下行:

<% for ... %>
<% endfor %>
<% if ... %>
<% endif %>

通过在您的 jinja2 环境中设置 trim_blocks=True 和 lstrip_blocks=True。见下面的例子,来自their docs的信息

context = 'querystring': querystring, 'path': path, 'content': content    
jinja_env = jinja2.Environment(
    loader=jinja2.FileSystemLoader('templates/'),
    trim_blocks=True,
    lstrip_blocks=True
)
print(jinja_env.get_template('my_template.yaml').render(context))

【讨论】:

以上是关于jinja2如何删除尾随换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中自动删除尾随空格?

如何阻止GCC从obj文件中的字符串文字中删除尾随换行符?

如何从二进制文件中删除开始换行符或开始新行?

从 fgets() 输入中删除尾随换行符

从 fgets() 输入中删除尾随换行符

Bash:从输出中去除尾随换行符