Conas aschur CSV a chruthúLink to this heading

Míníonn an doiciméad seo conas CSV (Luachanna Scartha Coma) a aschur go dinimiciúil ag úsáid radhairc Django. Chun seo a dhéanamh, is féidir leat leabharlann Python CSV nó an córas teimpléid Django a úsáid.

Leabharlann Python CSV a úsáidLink to this heading

Tagann Python le leabharlann CSV,: mod: csv. Is é an eochair chun é a úsáid le Django ná go ngníomhaíonn cumas cruthaithe CSV an mhodúil:mod: csv ar rudaí cosúil le comhad, agus is rudaí cosúil le comhad iad rudaí djangos:class: ~django.http.http.HttpResponse.

Seo sampla:

Code
import csv
from django.http import HttpResponse


def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(
        content_type="text/csv",
        headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
    )

    writer = csv.writer(response)
    writer.writerow(["First row", "Foo", "Bar", "Baz"])
    writer.writerow(["Second row", "A", "B", "C", '"Testing"', "Here's a quote"])

    return response

Ba chóir go mbeadh an cód agus na tuairimí féinmhínithe, ach tá cúpla rud tuillte ag lua:

  • Faigheann an freagra cineál speisialta MIME,: mimetype: text/csv. Insíonn sé seo do bhrabhsálaithe gur comhad CSV é an doiciméad, seachas comhad HTML. Má fhágann tú é seo amach, is dócha go léirmhíníonn brabhsálaithe an t-aschur mar HTML, rud a bheidh mar thoradh air go mbeidh gobbledygook gránna, scanrúil i bhfuinneog an bhrabhsálaí.

  • Faigheann an freagra ceannteideal breise ``Content-Disposition`, ina bhfuil ainm an chomhaid CSV. Tá an t-ainm comhaid seo treallach; glaoigh air cibé rud is mian leat. Úsáidfidh brabhsálaithe é sa dialóg “Sábháil mar...”, srl.

  • Is féidir leat dul isteach sa API giniúna CSV trí freagra ``a chur ar aghaidh mar an chéad argóint chuig `csv.writer`. Tá súil ag an bhfeidhm csv.writer réad cosúil le comhad, agus:class: ~django.http.httpResponse rudaí oiriúnach don bhille.

  • I gcás gach sraith i do chomhad CSV, glaoigh ar writer.writerow`, ag rith u:term: iterable.

  • Tugann an modúl CSV aire do luachan duit, mar sin ní gá duit a bheith buartha faoi teaghráin a éalú le luachana nó camóga iontu. Pas ``writerow () ``do theagáin amh, agus déanfaidh sé an rud ceart.

Comhaid mhóra CSV a shruthúLink to this heading

Agus tú ag déileáil le tuairimí a ghineann freagraí an-mhóra, b'fhéidir gur mhaith leat smaoineamh ar django's:class: ~django.http.StreamInghttPresponse a úsáid ina ionad. Mar shampla, trí chomhad a shruthú a thógann sé tamall fada chun a ghiniúint is féidir leat cothromóir ualaigh a sheachaint ag scaoileadh nasc a d'fhéadfadh a bheith curtha amach ar shlí eile agus an freastalaí ag giniúint an freagra.

In this example, we make full use of Python generators to efficiently handle the assembly and transmission of a large CSV file. Rows are batched together to reduce HTTP overhead and improve compression efficiency when used with GZipMiddleware:

Code
import csv
from itertools import batched

from django.http import StreamingHttpResponse


class Echo:
    """An object that implements just the write method of the file-like
    interface.
    """

    def write(self, value):
        """Write the value by returning it, instead of storing in a buffer."""
        return value


def some_streaming_csv_view(request):
    """A view that streams a large CSV file."""
    # Generate a sequence of rows. The range is based on the maximum number of
    # rows that can be handled by a single sheet in most spreadsheet
    # applications.
    rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
    pseudo_buffer = Echo()
    writer = csv.writer(pseudo_buffer)

    def stream_batched_rows():
        for batch in batched(rows, 100):
            yield "".join(writer.writerow(row) for row in batch)

    return StreamingHttpResponse(
        stream_batched_rows(),
        content_type="text/csv",
        headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
    )

An córas teimpléad a úsáidLink to this heading

De rogha air sin, is féidir leat an córas teimpléad: doc: Django a úsáid chun CSV a ghiniúint. </topics/templates> Tá sé seo ar leibhéal níos ísle ná an modúl áisiúil Python: MOD: csv a úsáid, ach cuirtear an réiteach i láthair anseo le haghaidh iomláine.

Is é an smaoineamh anseo liosta míreanna a chur chuig do theimpléad, agus an teimpléad a chur ar aschur na camóga in a:ttag: for lúb.

Seo sampla, a ghineann an comhad CSV céanna mar thuas:

Code
from django.http import HttpResponse
from django.template import loader


def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(
        content_type="text/csv",
        headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
    )

    # The data is hardcoded here, but you could load it from a database or
    # some other source.
    csv_data = (
        ("First row", "Foo", "Bar", "Baz"),
        ("Second row", "A", "B", "C", '"Testing"', "Here's a quote"),
    )

    t = loader.get_template("my_template_name.txt")
    c = {"data": csv_data}
    response.write(t.render(c))
    return response

Is é an t-aon difríocht idir an sampla seo agus an sampla roimhe seo ná go n-úsáideann an ceann seo luchtú teimpléid in ionad an modúl CSV. Tá an chuid eile den chód - mar shampla an content_type='text/csv' - mar an gcéanna.

Ansin, cruthaigh an teimpléad my_template_name.txt, leis an gcód teimpléad seo:

Django template
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}

Athraíonn an teimpléad gearr seo thar na sonraí a thugtar agus taispeánann sé líne CSV do gach sraith. Úsáideann sé an scagaire teimpléad:tfilter: addslashes chun a chinntiú nach bhfuil aon fhadhbanna le luachana.

Formáidí téacs-bhunaithe eileLink to this heading

Tabhair faoi deara nach bhfuil an-shonrach ann maidir le CSV anseo - díreach an fhormáid aschuir ar leith. Is féidir leat ceachtar de na teicnící seo a úsáid chun aon fhormáid téacs-bhunaithe is féidir leat a aisling a aschur. Is féidir leat teicníc den chineál céanna a úsáid freisin chun sonraí dénártha treallach a ghiniúint; féach:doc: /howto/outputting-pdf mar shampla.