python - Jinja2:使用 pandas 数据框或字符串变量

标签 python jinja2

我从 jinja2 模板中得到了意外的输出。

我有一个实例,其中表填充有单个值或一组值。每个的演示都有点不同,所以我想我可以使用条件 {% if my_variable is mapping %} 检查模板变量的状态,并相应地处理我的模板代码。 这是我的模板代码:

<table class="summary_table halfpage">
           <thead>
               <tr>
                 <th>
                     My Table
                 </th>
               </tr>
           </thead>
           <tbody>
           {% if my_variable is mapping %}
               {% for key,value in my_variable.iterrows() %}
                   <tr>
                     <td>
                       <p><strong>{{ value['Column1'] }} : </strong> {{ value['Column2'] }}</p>
                     </td>
                   </tr>
               {% endfor %}
            {% else %}
                  <tr>
                    <td>
                      <p><strong>{{ my_variable }}</strong></p>
                    </td>
                  </tr>
            {% endif %}
           </tbody>
       </table>

当 my_variable 是字符串(即不是映射)时,这可以正常工作。但是当它是一个映射时,我得到的不是一个很好渲染的表格:

           <table class="summary_table halfpage">
           <thead>
               <tr>
                 <th>
                     My Table
                 </th>
               </tr>
           </thead>
           <tbody>

                  <tr>
                    <td>
                      <p><strong>    Column1    Column2
0     6th  name 1
1     7th  name2
2     8th  name 2
3     9th  name 4</strong></p>
                    </td>
                  </tr>

           </tbody>
       </table>

这是生成该模板变量并将其加载到模板中的 python 代码:

def load_data(data_name, grade=None):
    file_path = os.path.join(data_path, for_who + "_" + when + "_" + data_name + ".csv")
    if not os.path.isfile(file_path):
        file_path = False   
    if file_path:
        data = pd.read_csv(file_path)
    else:
        data = False
    return data

def make_my_variable():
    data = load_data("relevant_data") 
    if not isinstance(data, pd.DataFrame):
        data = load_data("other_relevent_data")
        #in the case of "other_relevent_data" the column names are different
        data = data["ColumnA"].iloc[0]
    return data

report = report_tmpl.render(
    my_variable = make_my_variable()
)

html_output = os.path.join(output_path, for_who + "_" + date_transform(when) + ".html")
with open(html_output, 'w') as fh:
    fh.write(report)

知道我做错了什么吗?这在没有条件的情况下渲染得很好。

编辑:添加了创建 my_variable 并呈现模板的 python 代码

最佳答案

感谢@moooeeeep,我能够解决这个问题。正如他提到的,问题来自于 pd.DataFrame 在 jinja2 中不被识别为映射的事实。因此,我将数据框转换为列表:

def make_my_variable():
    data = load_data("relevant_data") 
    if not isinstance(data, pd.DataFrame):
        data = load_data("other_relevent_data")
        #in the case of "other_relevent_data" the column names are different
        data = data["ColumnA"].iloc[0]
    else:
        data = [(v["Column1"], v["Column2"]) for k,v in data .iterrows()]
    return data

在模板方面,我将条件更改为:

{% if my_variable is mapping %}
    {% for key,value in my_variable.iterrows() %}
#and latter...
<p><strong>{{ value['Column1'] }} grade:</strong> {{ value['Column2'] }}</p>

致:

{% if most_popular_games is iterable and my_variable is not string %}
    {% for value in my_variable %}
#and..
<p><strong>{{ value[0] }} grade:</strong> {{ value[1] }}</p>

总而言之,最终的模板代码现在如下所示:

<table class="summary_table halfpage">
           <thead>
               <tr>
                 <th>
                     My Table
                 </th>
               </tr>
           </thead>
           <tbody>
           {% if my_variable is iterable and my_variable is not string %}
               {% for value in my_variable %}
                   <tr>
                     <td>
                       <p><strong>{{ value[0] }} : </strong> {{ value[1] }}</p>
                     </td>
                   </tr>
               {% endfor %}
            {% else %}
                  <tr>
                    <td>
                      <p><strong>{{ my_variable }}</strong></p>
                    </td>
                  </tr>
            {% endif %}
           </tbody>
       </table>

关于python - Jinja2:使用 pandas 数据框或字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44761753/

相关文章:

python - 如何为下面给出的代码添加 "format"?

python - 如何在带有参数的 block 上使用 Jinja2 过滤器

python - SymPy -- 定义变量域

python - Pandas 如何分解不寻常的文本顺序

python - 在 Python 中实现梯度下降并收到溢出错误

for 循环中的 Ansible Jinja2 模板条件

python - 我可以在自定义 Flask jinja2 过滤器中组合内置过滤器吗?

python - 算法以其产品的顺序获取列表的每个可能子集,而不构建和排序整个列表(即生成器)

python - 将 {% include %} 的输出分配给 Jinja2 中的变量

python - 使用 Flask-python/jinja 等待 X 秒后页面重定向