【问题标题】:Create a csv file using Jinja2 [duplicate]使用 Jinja2 创建一个 csv 文件
【发布时间】:2020-04-06 05:04:52
【问题描述】:

我正在使用 Flask,我想使用 Jinja2 模板生成 csv 文件。根据 Jinja2 文档

Jinja 模板只是一个文本文件。 Jinja 可以生成任何基于文本的格式(HTML、XML、CSV、LaTeX 等)。 Jinja 模板不需要有特定的扩展名:.html、.xml 或任何其他扩展名都可以。

问题在于 Jinja2 非常擅长插入空格和换行符,这些会破坏 csv 输出,它应该只是一个记录文件,每个记录都是逗号分隔值的列表。

我需要使用 Jinja2 而不是 csv 模块,因为我需要的所有数据都已经存储在一个旨在提供给 Jinja2 的数据对象中(我通常生成 HTML,但有时生成 JSON,现在我想生成 csv)。

这是我的模板,注意 dp 是一个“数据页”对象,包含标题和值。

{% set g = namespace(comm0 = '', comma = '') %}

{# Header #}
{% for ix in range(dp.field_count) -%}

    {{ g.comm0 }}
    "{{ dp.fields[ix].label }}"
    {% set g.comm0 = ', ' %}

{%- endfor %}

{# Rows #}
{% for record in dp.records -%}

    {% set g.comma = '' %}

    {% for ix in range(dp.field_count) -%}

        {{ g.comma }}
        "{{ record.row[ix].value }}"
        {% set g.comma = ', ' %}

    {%- endfor %}

{%- endfor %}

这是输出的样子(已经使用 - 符号消除了一些空格)。





    "Staff Type"
    , 
    "Item"
    , 
    "Billable?"
    , 
    "Description"
    , 
    "Hourly Rate"
    , 
    "Date Changed"
    , 
    "Tag"






        "AC"
        , 
        ""
        , 
        "-1"
        , 
        "Associate Consultant"
        , 
        "20"
        , 
        ""
        , 
        ""



        "ACS"
        , 
        ""
        , 
        "-1"
        , 
        "Consultant"
        , 
        "29"
        , 
        ""
        , 
        ""



        "ADMIN"
        , 
        ""
        , 
        "0"
        , 
        "Administration"
        , 
        "20"
        , 
        ""
        , 
        ""

这就是 csv 的样子。

"Staff Type" ,  "Item" ,  "Billable?" ,  "Description" , "Hourly Rate" , "Date Changed", "Tag"
"AC", "", "-1", "Associate Consultant",  "20", "", ""
"ACS", "", "-1", "Consultant", "29", "", ""
"ADMIN", "", "0", "Administration", "20", "", ""

那么如何消除记录中的换行符,并在每条记录的末尾放置一个换行符,并去除剩余的不必要的空白。

【问题讨论】:

    标签: flask jinja2


    【解决方案1】:

    事实证明,我非常需要将那些 - 符号放在任何地方。此模板通过消除所有内容之间的空格(除了我想要换行的地方)来提供 csv。

    {% set g = namespace(comm0 = '', comma = '') -%}
    
    {# Header #}
    {%- for ix in range(dp.field_count) -%}
    
        {{- g.comm0 -}}
        "{{- dp.fields[ix].label -}}"
        {%- set g.comm0 = ', ' -%}
    
    {%- endfor %}
    
    {# Rows #}
    {%- for record in dp.records -%}
        {%- set g.comma = '' -%}
        {%- for ix in range(dp.field_count) -%}
    
            {{- g.comma -}}
            "{{- record.row[ix].value -}}"
            {%- set g.comma = ', ' -%}
    
        {%- endfor %}
    {% endfor %}
    

    请参阅the manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多