{"title":"CSV로 출력하는 방법","version":"4.2","locale":"ko","docname":"howto/outputting-csv","url":"/ko/4.2/howto/outputting-csv/","canonical":"https://djangodocs.dev/ko/4.2/howto/outputting-csv/","summary":"이 문서에서는 Django 보기를 사용하여 CSV(Comma Separated Values)를 동적으로 출력하는 방법에 대해 설명합니다. 이를 위해 Python CSV 라이브러리 또는 Django 템플릿 시스템을 사용할 수 있습니다. 파이썬 CSV 라이브러리 사용하기 Link to this…","html":"<h1>CSV로 출력하는 방법<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>이 문서에서는 Django 보기를 사용하여 CSV(Comma Separated Values)를 동적으로 출력하는 방법에 대해 설명합니다. 이를 위해 Python CSV 라이브러리 또는 Django 템플릿 시스템을 사용할 수 있습니다.</p>\n<section id=\"using-the-python-csv-library\">\n<h2>파이썬 CSV 라이브러리 사용하기<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은 CSV 라이브러리인 :mod:’csv’와 함께 제공됩니다. Django와 함께 사용하기 위한 핵심은 :mod:’csv’ 모듈의 CSV-생성 기능이 파일 같은 개체에 작용하고 Django의 :class는 다음과 같습니다.’~django.the’ 입니다.HttpResponse’ 객체는 파일 유사 객체입니다.</p>\n<p>여기 예제가 있습니다:</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>코드와 코멘트는 자명해야 하지만 몇 가지 사항은 언급할 가치가 있습니다.</p>\n<ul class=\"simple\">\n<li><p>응답에는 특수 MIME 유형인 :mimtype:’text/csv’가 있습니다. 이것은 문서가 HTML 파일이 아닌 CSV 파일임을 브라우저에 알려줍니다. 이 기능을 해제하면 브라우저가 출력을 HTML로 해석하여 브라우저 창에서 보기 흉하고 무서운 단어를 만들 수 있습니다.</p></li>\n<li><p>이 응답에는 CSV 파일의 이름이 포함된 “Content-Disposition” 헤더가 추가됩니다. 이 파일 이름은 임의이므로 원하는 대로 불러 주십시오. 브라우저가 “다른 이름으로 저장…”에서 사용합니다.대화 상자 등입니다.</p></li>\n<li><p>“csv.writer”에 대한 첫 번째 논거로 “대응”을 전달함으로써 CSV 세대 API에 연결할 수 있습니다. “csv.writer” 기능은 파일 같은 객체를 기대하며 :class는 다음과 같습니다.’~django.the’ 입니다.HttpResponse’ 객체가 빌에 맞습니다.</p></li>\n<li><p>CSV 파일의 각 행에 대해 ‘’writer’’로 전화하십시오.”글쓴다”는 뜻으로 “표절할 수 있다”라는 말을 씁니다.</p></li>\n<li><p>CSV 모듈은 견적을 처리하므로 따옴표 또는 쉼표가 포함된 문자열을 이스케이프할 필요가 없습니다. “원래의 조건”을 넘기면 옳은 일을 할 수 있을 것입니다.</p></li>\n</ul>\n<section id=\"streaming-large-csv-files\">\n<span id=\"streaming-csv-files\"></span><h3>대용량 CSV 파일들을 스트리밍하기<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>매우 큰 응답을 생성하는 보기를 처리할 때 Django의 :class:를 사용하는 것을 고려할 수 있습니다.’~django.the’ 입니다.대신 스트리밍HttpResponse’입니다. 예를 들어, 생성하는 데 시간이 오래 걸리는 파일을 스트리밍하면 서버가 응답을 생성하는 동안 시간 초과되었을 수 있는 연결을 로드 밸런서가 삭제하지 않도록 방지할 수 있습니다.</p>\n<p>이 예에서는 Python 생성기를 최대한 활용하여 대형 CSV 파일의 어셈블리 및 전송을 효율적으로 처리합니다.</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\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    <span class=\"k\">return</span> <span class=\"n\">StreamingHttpResponse</span><span class=\"p\">(</span>\n        <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\">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>템플릿 시스템 사용하기<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>또는 :doc을 사용할 수 있습니다.CSV를 생성하기 위한 ‘장고 템플릿 시스템’입니다. 이는 편리한 Python:mod:’csv’ 모듈을 사용하는 것보다 낮은 수준이지만, 완벽함을 위해 솔루션을 제공합니다.</p>\n<p>여기서의 아이디어는 템플릿에 항목 목록을 전달하고 템플릿이 쉼표를 :ttag:’for’ 루프에 출력하도록 하는 것입니다.</p>\n<p>다음은 위와 동일한 CSV 파일을 생성하는 예입니다.</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 hard-coded 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>이 예와 이전 예와의 유일한 차이점은 이 예에서는 CSV 모듈 대신 템플릿 로드를 사용한다는 것입니다. “content_type type’text/csv”와 같은 나머지 코드는 동일합니다.</p>\n<p>그런 다음 ‘’my_template_name’ 템플릿을 생성합니다.txt², 이 템플릿 코드로 다음을 수행합니다.</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>이 짧은 템플릿은 지정된 데이터에 대해 반복되고 각 행에 대해 CSV 줄을 표시합니다. :t filter:’addslash’ 템플릿 필터를 사용하여 따옴표에 문제가 없도록 합니다.</p>\n</section>\n<section id=\"other-text-based-formats\">\n<h2>기타 텍스트 기반 형식입니다.<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>CSV에 대한 구체적인 내용은 없고 특정 출력 형식만 있습니다. 이러한 기술 중 하나를 사용하여 원하는 텍스트 기반 형식을 출력할 수 있습니다. 유사한 기술을 사용하여 임의 이진 데이터를 생성할 수도 있습니다. 예제는 :doc:’/howto/output-pdf’를 참조하십시오.</p>\n</section>","rootId":"how-to-create-csv-output","toc":[{"title":"파이썬 CSV 라이브러리 사용하기","anchor":"using-the-python-csv-library","children":[{"title":"대용량 CSV 파일들을 스트리밍하기","anchor":"streaming-large-csv-files","children":[]}]},{"title":"템플릿 시스템 사용하기","anchor":"using-the-template-system","children":[]},{"title":"기타 텍스트 기반 형식입니다.","anchor":"other-text-based-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"“How-to” 가이드","url":"/ko/4.2/howto/"}],"prev":{"docname":"howto/logging","title":"로깅 구성 및 사용 방법","url":"/ko/4.2/howto/logging/"},"next":{"docname":"howto/outputting-pdf","title":"PDF 파일을 만드는 방법","url":"/ko/4.2/howto/outputting-pdf/"},"formats":{"html":"/ko/4.2/howto/outputting-csv/","markdown":"/ko/4.2/howto/outputting-csv.md","json":"/ko/4.2/howto/outputting-csv.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/howto/outputting-csv.txt","official":"https://docs.djangoproject.com/ko/4.2/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"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}