This template will do what you want. Simply replace the list of binary_sensors with your own.
{% set doors = expand('binary_sensor.front_door', 'binary_sensor.rear_door', 'binary_sensor.garage_door')
| selectattr('state', 'eq', 'on')
| map(attribute='name') | list %}
{% set qty = doors | count %}
{% set p1 = 'are' if qty > 1 else 'is' %}
{% if qty == 0 %}
No doors are open.
{% else %}
{{' and '.join((doors | join(', ')).rsplit(', ', 1))}} {{p1}} open.
{% endif %}
The template uses this technique in order to use the word “and” correctly when there are two or more open doors.
The template can be used in a Markdown card or even in a Template Sensor.
If you wish to experiment with the template, simply paste it into the Template Editor.
