{"title":"Hur man skapar CSV-utdata","version":"6.1","locale":"sv","docname":"howto/outputting-csv","url":"/sv/6.1/howto/outputting-csv/","canonical":"https://djangodocs.dev/sv/6.1/howto/outputting-csv/","summary":"Detta dokument förklarar hur man dynamiskt skriver ut CSV (Comma Separated Values) med hjälp av Django-vyer. För att göra detta kan du antingen använda Pythons…","html":"<h1>Hur man skapar CSV-utdata<a class=\"heading-anchor\" href=\"#how-to-create-csv-output\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Detta dokument förklarar hur man dynamiskt skriver ut CSV (Comma Separated Values) med hjälp av Django-vyer. För att göra detta kan du antingen använda Pythons CSV-bibliotek eller Djangos mallsystem.</p>\n<section id=\"using-the-python-csv-library\">\n<h2>Använda Pythons CSV-bibliotek<a class=\"heading-anchor\" href=\"#using-the-python-csv-library\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python levereras med ett CSV-bibliotek, <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a>. Nyckeln till att använda det med Django är att <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a>-modulens CSV-skapande kapacitet fungerar på filliknande objekt, och Djangos <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt är filliknande objekt.</p>\n<p>Här är ett exempel:</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=\"w\"> </span><span class=\"nn\">csv</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span>\n        <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">headers</span><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=\"n\">writer</span> <span class=\"o\">=</span> <span class=\"n\">csv</span><span class=\"o\">.</span><span class=\"n\">writer</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">)</span>\n    <span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><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=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><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> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Koden och kommentarerna borde vara självförklarande, men det finns några saker som förtjänar att nämnas:</p>\n<ul class=\"simple\">\n<li><p>Svaret får en speciell MIME-typ, <em class=\"mimetype\">text/csv</em>. Detta talar om för webbläsarna att dokumentet är en CSV-fil, snarare än en HTML-fil. Om du utelämnar detta kommer webbläsarna förmodligen att tolka utdata som HTML, vilket resulterar i ful, skrämmande gobbledygook i webbläsarfönstret.</p></li>\n<li><p>Svaret får ytterligare en <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code> header, som innehåller namnet på CSV-filen. Detta filnamn är godtyckligt; kalla det vad du vill. Det kommer att användas av webbläsare i dialogrutan ”Spara som…” etc.</p></li>\n<li><p>Du kan koppla in dig på CSV-generering API genom att skicka <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> som det första argumentet till <code class=\"docutils literal notranslate\"><span class=\"pre\">csv.writer</span></code>. Funktionen <code class=\"docutils literal notranslate\"><span class=\"pre\">csv.writer</span></code> förväntar sig ett filliknande objekt, och <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt passar bra.</p></li>\n<li><p>För varje rad i CSV-filen anropar du <code class=\"docutils literal notranslate\"><span class=\"pre\">writer.writerow</span></code> och ger den en <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-iterable\" title=\"(in Python v3.14)\"><span class=\"xref std std-term\">iterable</span></a>.</p></li>\n<li><p>CSV-modulen tar hand om citering åt dig, så du behöver inte oroa dig för att undkomma strängar med citattecken eller kommatecken i dem. Skicka dina råa strängar till <code class=\"docutils literal notranslate\"><span class=\"pre\">writerow()</span></code> så gör den det rätta.</p></li>\n</ul>\n<section id=\"streaming-large-csv-files\">\n<span id=\"streaming-csv-files\"></span><h3>Streaming av stora CSV-filer<a class=\"heading-anchor\" href=\"#streaming-large-csv-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du hanterar vyer som genererar mycket stora svar kanske du vill överväga att använda Djangos <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> istället. Genom att strömma en fil som tar lång tid att generera kan du till exempel undvika att en lastbalanserare tappar en anslutning som annars skulle ha avbrutits medan servern genererade svaret.</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=\"/sv/6.1/ref/middleware/#django.middleware.gzip.GZipMiddleware\" title=\"django.middleware.gzip.GZipMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></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=\"w\"> </span><span class=\"nn\">csv</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">batched</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">StreamingHttpResponse</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Echo</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><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=\"w\"> </span><span class=\"nf\">write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><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> <span class=\"n\">value</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_streaming_csv_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><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    <span class=\"n\">rows</span> <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><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">idx</span><span class=\"p\">),</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">idx</span><span class=\"p\">)]</span> <span class=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">65536</span><span class=\"p\">))</span>\n    <span class=\"n\">pseudo_buffer</span> <span class=\"o\">=</span> <span class=\"n\">Echo</span><span class=\"p\">()</span>\n    <span class=\"n\">writer</span> <span class=\"o\">=</span> <span class=\"n\">csv</span><span class=\"o\">.</span><span class=\"n\">writer</span><span class=\"p\">(</span><span class=\"n\">pseudo_buffer</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">stream_batched_rows</span><span class=\"p\">():</span>\n        <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"n\">batched</span><span class=\"p\">(</span><span class=\"n\">rows</span><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><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><span class=\"p\">(</span><span class=\"n\">row</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">batch</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">StreamingHttpResponse</span><span class=\"p\">(</span>\n        <span class=\"n\">stream_batched_rows</span><span class=\"p\">(),</span>\n        <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">headers</span><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>Använda mallsystemet<a class=\"heading-anchor\" href=\"#using-the-template-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Alternativt kan du använda <a class=\"reference internal\" href=\"/sv/6.1/topics/templates/\"><span class=\"doc\">Django mallsystem</span></a> för att generera CSV. Detta är på en lägre nivå än att använda den praktiska Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a>-modulen, men lösningen presenteras här för fullständighetens skull.</p>\n<p>Tanken här är att skicka en lista med objekt till din mall och låta mallen mata ut kommatecken i en <a class=\"reference internal\" href=\"/sv/6.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a>-loop.</p>\n<p>Här är ett exempel som genererar samma CSV-fil som ovan:</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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">loader</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span>\n        <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">headers</span><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    <span class=\"n\">csv_data</span> <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    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_template_name.txt&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">:</span> <span class=\"n\">csv_data</span><span class=\"p\">}</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Den enda skillnaden mellan det här exemplet och det föregående är att det här exemplet använder template loading i stället för CSV-modulen. Resten av koden - till exempel <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type='text/csv'</span></code> - är densamma.</p>\n<p>Skapa sedan mallen <code class=\"docutils literal notranslate\"><span class=\"pre\">my_template_name.txt</span></code>, med denna mallkod:</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>Denna korta mall itererar över de angivna data och visar en rad CSV för varje rad. Den använder mallfiltret <a class=\"reference internal\" href=\"/sv/6.1/ref/templates/builtins/#std-templatefilter-addslashes\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">addslashes</span></code></a> för att säkerställa att det inte finns några problem med citattecken.</p>\n</section>\n<section id=\"other-text-based-formats\">\n<h2>Andra textbaserade format<a class=\"heading-anchor\" href=\"#other-text-based-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Observera att det inte finns så mycket specifikt för CSV här - bara det specifika utdataformatet. Du kan använda någon av dessa tekniker för att mata ut vilket textbaserat format som helst som du kan drömma om. Du kan också använda en liknande teknik för att generera godtyckliga binära data; se <a class=\"reference internal\" href=\"/sv/6.1/howto/outputting-pdf/\"><span class=\"doc\">Så här skapar du PDF-filer</span></a> för ett exempel.</p>\n</section>","rootId":"how-to-create-csv-output","toc":[{"title":"Använda Pythons CSV-bibliotek","anchor":"using-the-python-csv-library","children":[{"title":"Streaming av stora CSV-filer","anchor":"streaming-large-csv-files","children":[]}]},{"title":"Använda mallsystemet","anchor":"using-the-template-system","children":[]},{"title":"Andra textbaserade format","anchor":"other-text-based-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Hur man gör-guider","url":"/sv/6.1/howto/"}],"prev":{"docname":"howto/custom-lookups","title":"Hur man skriver anpassade uppslagsord","url":"/sv/6.1/howto/custom-lookups/"},"next":{"docname":"howto/outputting-pdf","title":"Så här skapar du PDF-filer","url":"/sv/6.1/howto/outputting-pdf/"},"formats":{"html":"/sv/6.1/howto/outputting-csv/","markdown":"/sv/6.1/howto/outputting-csv.md","json":"/sv/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/sv/6.1/howto/outputting-csv/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}