{"title":"How to create CSV output","version":"6.1","locale":"pt-br","docname":"howto/outputting-csv","url":"/pt-br/6.1/howto/outputting-csv/","canonical":"https://djangodocs.dev/pt-br/6.1/howto/outputting-csv/","summary":"Este documento explica como emitir CSV (valores separados por vírgulas) dinamicamente usando “views” do Django.","html":"<h1>How to create CSV output<a class=\"heading-anchor\" href=\"#how-to-create-csv-output\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este documento explica como emitir CSV (valores separados por vírgulas) dinamicamente usando “views” do Django. Para fazer isso, você pode usar a biblioteca CSV do Python ou o sistema de templates do Django.</p>\n<section id=\"using-the-python-csv-library\">\n<h2>Usando a biblioteca CSV do Python.<a class=\"heading-anchor\" href=\"#using-the-python-csv-library\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python vem com uma biblioteca CSV, <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">csv</code></a>. A chave para usá-lo com Django é que a capacidade CSV-creation do módulo <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">csv</code></a>  age como um objeto “file-like”, e aos objetos da class:~django.http.HttpResponse do Django são objetos “file-like”.</p>\n<p>Aqui está um exemplo</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">csv</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n\n<span class=\"k\">def</span> <span class=\"nf\">some_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    response <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span>\n        content_type<span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        headers<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Content-Disposition&quot;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span><span class=\"p\">},</span>\n    <span class=\"p\">)</span>\n\n    writer <span class=\"o\">=</span> csv<span class=\"o\">.</span>writer<span class=\"p\">(</span>response<span class=\"p\">)</span>\n    writer<span class=\"o\">.</span>writerow<span class=\"p\">([</span><span class=\"s2\">&quot;First row&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Bar&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Baz&quot;</span><span class=\"p\">])</span>\n    writer<span class=\"o\">.</span>writerow<span class=\"p\">([</span><span class=\"s2\">&quot;Second row&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;A&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;B&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;C&quot;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;&quot;Testing&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Here&#39;s a quote&quot;</span><span class=\"p\">])</span>\n\n    <span class=\"k\">return</span> response\n</code></pre></div>\n<p>O código e comentário devem ser auto-explanaveis, mas algumas coisas merecem uma menção.</p>\n<ul class=\"simple\">\n<li><p>A resposta recebe um tipo MIME especial <em class=\"mimetype\">text/csv</em>. Isso diz ao browser que o documento é um arquivo CSV, ao invés de um arquivo HTML. Se deixar isso desligado, os browsers vão provavelmente interpretar a resposta como HTML, o qual irá resultar em uma feia e assustadora gobbledygook na janela do seu browser.</p></li>\n<li><p>A resposta recebe um cabeçalho adicional <code class=\"docutils literal notranslate\">Content-Dispoition</code>, o qual contém o nome do arquivo CSV. Este nome de arquivo e arbitrário; chame isso do que você quiser. Ele será usado pelo browser no diálogo “Salvar como…”, etc.</p></li>\n<li><p>You can hook into the CSV-generation API by passing <code class=\"docutils literal notranslate\">response</code> as the first\nargument to <code class=\"docutils literal notranslate\">csv.writer</code>. The <code class=\"docutils literal notranslate\">csv.writer</code> function expects a file-like\nobject, and <a class=\"reference internal\" href=\"/pt-br/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> objects fit the bill.</p></li>\n<li><p>Para cada linha no seu arquivo CSV, chamar o método <code class=\"docutils literal notranslate\">writer.writerow</code>, passando um <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-iterable\" title=\"(em Python v3.14)\"><span class=\"xref std std-term\">iterable</span></a>.</p></li>\n<li><p>The CSV module takes care of quoting for you, so you don’t have to worry\nabout escaping strings with quotes or commas in them. Pass <code class=\"docutils literal notranslate\">writerow()</code>\nyour raw strings, and it’ll do the right thing.</p></li>\n</ul>\n<section id=\"streaming-large-csv-files\">\n<span id=\"streaming-csv-files\"></span><h3>Transmitindo grandes arquivos CSV<a class=\"heading-anchor\" href=\"#streaming-large-csv-files\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Quando lida com “views” que geram respostas muito grandes, talvez queira considerar usar o <a class=\"reference internal\" href=\"/pt-br/6.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">StreamingHttpResponse</code></a> do Django no lugar. Por exemplo, por trasmitir em fluxo contínuo ou “streaming” um arquivo que leva muito tempo para ser gerado você pode evitar que a conexão seja perdida tentando balancear a carga que talvez expire enquanto o servidor estava gerando a resposta.</p>\n<p>In this example, we make full use of Python generators to efficiently handle\nthe assembly and transmission of a large CSV file. Rows are batched together\nto reduce HTTP overhead and improve compression efficiency when used with\n<a class=\"reference internal\" href=\"/pt-br/6.1/ref/middleware/#django.middleware.gzip.GZipMiddleware\" title=\"django.middleware.gzip.GZipMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">GZipMiddleware</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">csv</span>\n<span class=\"kn\">from</span> <span class=\"nn\">itertools</span> <span class=\"kn\">import</span> batched\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> StreamingHttpResponse\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Echo</span><span class=\"p\">:</span>\n    <span class=\"sd\">&quot;&quot;&quot;An object that implements just the write method of the file-like</span>\n<span class=\"sd\">    interface.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Write the value by returning it, instead of storing in a buffer.&quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> value\n\n\n<span class=\"k\">def</span> <span class=\"nf\">some_streaming_csv_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A view that streams a large CSV file.&quot;&quot;&quot;</span>\n    <span class=\"c1\"># Generate a sequence of rows. The range is based on the maximum number of</span>\n    <span class=\"c1\"># rows that can be handled by a single sheet in most spreadsheet</span>\n    <span class=\"c1\"># applications.</span>\n    rows <span class=\"o\">=</span> <span class=\"p\">([</span><span class=\"s2\">&quot;Row </span><span class=\"si\">{}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span>format<span class=\"p\">(</span>idx<span class=\"p\">),</span> <span class=\"nb\">str</span><span class=\"p\">(</span>idx<span class=\"p\">)]</span> <span class=\"k\">for</span> idx <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">65536</span><span class=\"p\">))</span>\n    pseudo_buffer <span class=\"o\">=</span> Echo<span class=\"p\">()</span>\n    writer <span class=\"o\">=</span> csv<span class=\"o\">.</span>writer<span class=\"p\">(</span>pseudo_buffer<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">stream_batched_rows</span><span class=\"p\">():</span>\n        <span class=\"k\">for</span> batch <span class=\"ow\">in</span> batched<span class=\"p\">(</span>rows<span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">):</span>\n            <span class=\"k\">yield</span> <span class=\"s2\">&quot;&quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>writer<span class=\"o\">.</span>writerow<span class=\"p\">(</span>row<span class=\"p\">)</span> <span class=\"k\">for</span> row <span class=\"ow\">in</span> batch<span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> StreamingHttpResponse<span class=\"p\">(</span>\n        stream_batched_rows<span class=\"p\">(),</span>\n        content_type<span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        headers<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Content-Disposition&quot;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span><span class=\"p\">},</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"using-the-template-system\">\n<h2>Usando o sistema de template.<a class=\"heading-anchor\" href=\"#using-the-template-system\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Uma alternatica, você pode usar o <a class=\"reference internal\" href=\"/pt-br/6.1/topics/templates/\"><span class=\"doc\">sistema de tempaltes do Django</span></a> para gerar CSV. Isso é mais baixo nível que usar o conveniente módulo Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">csv</code></a>, mas a solução é apresentada aqui para para abrangência.</p>\n<p>A idéia aqui é passar uma lista de itens para seu template, e ter a saida do template as vírgulas em um loop <a class=\"reference internal\" href=\"/pt-br/6.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\">for</code></a>.</p>\n<p>Aqui um exemplo, o qual gera o mesmo arquivo CSV que acima:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.template</span> <span class=\"kn\">import</span> loader\n\n\n<span class=\"k\">def</span> <span class=\"nf\">some_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    response <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span>\n        content_type<span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        headers<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Content-Disposition&quot;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span><span class=\"p\">},</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"c1\"># The data is hardcoded here, but you could load it from a database or</span>\n    <span class=\"c1\"># some other source.</span>\n    csv_data <span class=\"o\">=</span> <span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;First row&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Bar&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Baz&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Second row&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;A&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;B&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;C&quot;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;&quot;Testing&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Here&#39;s a quote&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n\n    t <span class=\"o\">=</span> loader<span class=\"o\">.</span>get_template<span class=\"p\">(</span><span class=\"s2\">&quot;my_template_name.txt&quot;</span><span class=\"p\">)</span>\n    c <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">:</span> csv_data<span class=\"p\">}</span>\n    response<span class=\"o\">.</span>write<span class=\"p\">(</span>t<span class=\"o\">.</span>render<span class=\"p\">(</span>c<span class=\"p\">))</span>\n    <span class=\"k\">return</span> response\n</code></pre></div>\n<p>A única diferença entre este exemplo e o exemplo anterior é que este usa carga de template ao invés do módulo CSV. O resto do código – tal como <code class=\"docutils literal notranslate\">content_type='text/csv'</code> –  é o mesmo.</p>\n<p>Então, crie o template <code class=\"docutils literal notranslate\">my_template_name.txt</code>,  com este código no template:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">row</span> <span class=\"k\">in</span> <span class=\"nv\">data</span> <span class=\"cp\">%}</span>&quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.0</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.1</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.2</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.3</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.4</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>This short template iterates over the given data and displays a line of CSV for\neach row. It uses the <a class=\"reference internal\" href=\"/pt-br/6.1/ref/templates/builtins/#std-templatefilter-addslashes\"><code class=\"xref std std-tfilter docutils literal notranslate\">addslashes</code></a> template filter to ensure there\naren’t any problems with quotes.</p>\n</section>\n<section id=\"other-text-based-formats\">\n<h2>Outros formatos baseados em texto.<a class=\"heading-anchor\" href=\"#other-text-based-formats\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Note que não tem muita coisa específica sobre CSV aqui – apenas o formato de saída. Você pode usar qualquer uma destas técnicas para qualquer formato texto que você imagine. Você também pode usar essa técnica para gerar dados binários arbitrários; veja <a class=\"reference internal\" href=\"/pt-br/6.1/howto/outputting-pdf/\"><span class=\"doc\">How to create PDF files</span></a> por exemplo.</p>\n</section>","rootId":"how-to-create-csv-output","toc":[{"title":"Usando a biblioteca CSV do Python.","anchor":"using-the-python-csv-library","children":[{"title":"Transmitindo grandes arquivos CSV","anchor":"streaming-large-csv-files","children":[]}]},{"title":"Usando o sistema de template.","anchor":"using-the-template-system","children":[]},{"title":"Outros formatos baseados em texto.","anchor":"other-text-based-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/pt-br/6.1/howto/"}],"prev":{"docname":"howto/custom-lookups","title":"Como escrever pesquisadores customizadas","url":"/pt-br/6.1/howto/custom-lookups/"},"next":{"docname":"howto/outputting-pdf","title":"How to create PDF files","url":"/pt-br/6.1/howto/outputting-pdf/"},"formats":{"html":"/pt-br/6.1/howto/outputting-csv/","markdown":"/pt-br/6.1/howto/outputting-csv.md","json":"/pt-br/6.1/howto/outputting-csv.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/outputting-csv.txt","official":"https://docs.djangoproject.com/pt-br/6.1/howto/outputting-csv/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}