如何用 Jinja 默认过滤器替换 NaN?
How to replace NaN with Jinja default filter?
我正在尝试使用 default
filter in Jinja2 将缺失值替换为默认值。
原来我的数据源有一些 NaN,而不仅仅是缺失值。
对于我的用例,我想用默认值替换 NaN。
但是 default
过滤器只是通过 NaN
而没有替换。
Jinja2 中是否有任何过滤器可以让我轻松地将 NaN 值替换为其他值? (当然我可以写一个自定义过滤器,我只是想知道是否有更简单的解决方案。)
对于上下文,我是从 Ansible 做的,它有 a few more filters available than plain Jinja2.
MWE
playbook.yaml
---
- hosts: localhost
connection: local
tasks:
- name: generate cloudformation template
template:
src: input.j2
dest: output.txt
vars:
data:
- value: 123
comment: this is an integer
- value: None
comment: This is None
- value: NaN
comment: This is NaN
- comment: this is missing
- value: ''
comment: empty string
input.j2
{% for row in data %}
{{ row['comment'] }}
{{ row['value'] | default('default') }}
{{ row['value'] | default('default', boolean=True) }}
{% endfor %}
运行 与:
ansible-playbook playbook.yaml
cat output.txt
实际行为
this is an integer
123
123
123
This is None
None
None
default
This is NaN
NaN
default
default
this is missing
default
default
default
empty string
default
default
期望的行为
...
This is NaN
NaN
default
default
...
(最好也有一个替代 None
s 的解决方案。我不确定为什么 None | default('x', boolean=True)
不这样做,因为 None
是错误的。 )
默认 过滤器不会在这里帮助您。自定义过滤器可能是简化代码的好主意。但是,您也可以使用当前过滤器转换数据。
例如属性缺失先添加默认值
_data_default:
- value: default
_data: "{{ _data_default|product(data)|map('combine')|list }}"
_data:
- comment: this is an integer
value: 123
- comment: This is None
value: None
- comment: This is NaN
value: NaN
- comment: this is missing
value: default
- comment: empty string
value: ''
替换值
_regex: '^NaN|None|null$'
_regex_empty: '^$'
_replace: default
_data_values: "{{ _data|map(attribute='value')|
map('regex_replace', _regex, _replace)|
map('regex_replace', _regex_empty, _replace)|
map('community.general.dict_kv', 'value')|list }}"
_data_values:
- value: '123'
- value: default
- value: default
- value: default
- value: default
并合并列表中的项目
data2: "{{ data|zip(_data_values)|map('combine')|list }}"
data2:
- comment: this is an integer
value: '123'
- comment: This is None
value: default
- comment: This is NaN
value: default
- comment: this is missing
value: default
- comment: empty string
value: default
根据您的需要调整选项并将变量设置为 appropriate。
我正在尝试使用 default
filter in Jinja2 将缺失值替换为默认值。
原来我的数据源有一些 NaN,而不仅仅是缺失值。
对于我的用例,我想用默认值替换 NaN。
但是 default
过滤器只是通过 NaN
而没有替换。
Jinja2 中是否有任何过滤器可以让我轻松地将 NaN 值替换为其他值? (当然我可以写一个自定义过滤器,我只是想知道是否有更简单的解决方案。)
对于上下文,我是从 Ansible 做的,它有 a few more filters available than plain Jinja2.
MWE
playbook.yaml
---
- hosts: localhost
connection: local
tasks:
- name: generate cloudformation template
template:
src: input.j2
dest: output.txt
vars:
data:
- value: 123
comment: this is an integer
- value: None
comment: This is None
- value: NaN
comment: This is NaN
- comment: this is missing
- value: ''
comment: empty string
input.j2
{% for row in data %}
{{ row['comment'] }}
{{ row['value'] | default('default') }}
{{ row['value'] | default('default', boolean=True) }}
{% endfor %}
运行 与:
ansible-playbook playbook.yaml
cat output.txt
实际行为
this is an integer
123
123
123
This is None
None
None
default
This is NaN
NaN
default
default
this is missing
default
default
default
empty string
default
default
期望的行为
...
This is NaN
NaN
default
default
...
(最好也有一个替代 None
s 的解决方案。我不确定为什么 None | default('x', boolean=True)
不这样做,因为 None
是错误的。 )
默认 过滤器不会在这里帮助您。自定义过滤器可能是简化代码的好主意。但是,您也可以使用当前过滤器转换数据。
例如属性缺失先添加默认值
_data_default:
- value: default
_data: "{{ _data_default|product(data)|map('combine')|list }}"
_data:
- comment: this is an integer
value: 123
- comment: This is None
value: None
- comment: This is NaN
value: NaN
- comment: this is missing
value: default
- comment: empty string
value: ''
替换值
_regex: '^NaN|None|null$'
_regex_empty: '^$'
_replace: default
_data_values: "{{ _data|map(attribute='value')|
map('regex_replace', _regex, _replace)|
map('regex_replace', _regex_empty, _replace)|
map('community.general.dict_kv', 'value')|list }}"
_data_values:
- value: '123'
- value: default
- value: default
- value: default
- value: default
并合并列表中的项目
data2: "{{ data|zip(_data_values)|map('combine')|list }}"
data2:
- comment: this is an integer
value: '123'
- comment: This is None
value: default
- comment: This is NaN
value: default
- comment: this is missing
value: default
- comment: empty string
value: default
根据您的需要调整选项并将变量设置为 appropriate。