Django 2.1 - Outputting CSV with Django

Django के साथ CSV आउटपुट




django

Django के साथ CSV आउटपुट

यह दस्तावेज़ बताता है कि कैसे DjVo विचारों का उपयोग करके CSV (कोमा सेपरेटेड वैल्यूज़) को गतिशील रूप से आउटपुट किया जाए। ऐसा करने के लिए, आप या तो पायथन CSV लाइब्रेरी या Django टेम्प्लेट सिस्टम का उपयोग कर सकते हैं।

पायथन सीएसवी पुस्तकालय का उपयोग करना

पायथन सीएसवी पुस्तकालय, csv साथ आता है। Django के साथ इसका उपयोग करने की कुंजी यह है कि csv मॉड्यूल की CSV-निर्माण क्षमता फ़ाइल जैसी वस्तुओं पर कार्य करती है, और Django की HttpResponse ऑब्जेक्ट फ़ाइल जैसी ऑब्जेक्ट हैं।

यहाँ एक उदाहरण है:

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')
    response['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

कोड और टिप्पणियां स्व-व्याख्यात्मक होनी चाहिए, लेकिन कुछ चीजें एक उल्लेख के लायक हैं:

  • प्रतिक्रिया को एक विशेष MIME प्रकार, पाठ / csv मिलता है । यह ब्राउज़रों को बताता है कि दस्तावेज़ एक HTML फ़ाइल के बजाय एक CSV फ़ाइल है। यदि आप इसे छोड़ देते हैं, तो ब्राउज़र शायद आउटपुट को HTML के रूप में व्याख्या करेंगे, जिसके परिणामस्वरूप ब्राउज़र विंडो में बदसूरत, डरावना gobbledygook होगा।
  • प्रतिक्रिया को एक अतिरिक्त Content-Disposition शीर्षक मिलता है, जिसमें CSV फ़ाइल का नाम होता है। यह फ़ाइल नाम मनमाना है; आप उसे जो चाहें कहें। इसका उपयोग ब्राउज़र द्वारा "इस रूप में सहेजें ..." संवाद आदि में किया जाएगा।
  • CSV- जनरेशन API में csv.writer करना आसान है: csv.writer के पहले तर्क के रूप में response csv.writercsv.writer फ़ंक्शन फ़ाइल जैसी ऑब्जेक्ट की अपेक्षा करता है, और HttpResponse ऑब्जेक्ट बिल को फिट करते हैं।
  • अपनी CSV फ़ाइल में प्रत्येक पंक्ति के लिए, writer.writerow कॉल करें, इसे सूची या टपल जैसे writer.writerow योग्य ऑब्जेक्ट को पास करना।
  • CSV मॉड्यूल आपके लिए उद्धरण का ध्यान रखता है, इसलिए आपको उद्धरण या कॉमा के साथ तार से बचने के बारे में चिंता करने की आवश्यकता नहीं है। बस अपने कच्चे तार writerow() गुजरती हैं, और यह सही काम करेंगे।

बड़े CSV फ़ाइलों को स्ट्रीम करना

बहुत बड़ी प्रतिक्रियाओं को उत्पन्न करने वाले विचारों से निपटने के दौरान, आप इसके बजाय Django के StreamingHttpResponse का उपयोग करने पर विचार कर सकते हैं। उदाहरण के लिए, एक फ़ाइल को स्ट्रीम करने से जो आपको जेनरेट करने में लंबा समय लगता है, एक कनेक्शन को लोड करने वाले बैलेंसर से बच सकते हैं जो कि सर्वर द्वारा प्रतिक्रिया उत्पन्न करने के दौरान अन्यथा समाप्त हो सकता है।

इस उदाहरण में, हम बड़ी CSV फ़ाइल के असेंबली और ट्रांसमिशन को कुशलतापूर्वक संभालने के लिए पायथन जनरेटर का पूरा उपयोग करते हैं:

import csv

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)
    response = StreamingHttpResponse((writer.writerow(row) for row in rows),
                                     content_type="text/csv")
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
    return response

टेम्पलेट प्रणाली का उपयोग करना

वैकल्पिक रूप से, आप CSV उत्पन्न करने के लिए Django टेम्पलेट सिस्टम का उपयोग कर सकते हैं। यह सुविधाजनक पायथन csv मॉड्यूल का उपयोग करने की तुलना में निम्न-स्तर है, लेकिन समाधान पूर्णता के लिए यहां प्रस्तुत किया गया है।

यहाँ विचार आपके टेम्पलेट की मदों की एक सूची को पास करने का है, और टेम्पलेट for लूप के for कॉमा आउटपुट for है।

यहाँ एक उदाहरण है, जो ऊपर की तरह ही CSV फ़ाइल बनाता है:

from django.http import HttpResponse
from django.template import Context, loader

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

    # The data is hard-coded 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 = Context({
        'data': csv_data,
    })
    response.write(t.render(c))
    return response

इस उदाहरण और पिछले उदाहरण के बीच एकमात्र अंतर यह है कि यह CSV मॉड्यूल के बजाय टेम्पलेट लोडिंग का उपयोग करता है। बाकी कोड - जैसे कि content_type='text/csv' - समान है।

फिर, इस टेम्पलेट कोड के साथ टेम्पलेट my_template_name.txt बनाएँ:

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

यह टेम्पलेट काफी बुनियादी है। यह सिर्फ दिए गए डेटा पर निर्भर करता है और प्रत्येक पंक्ति के लिए CSV की एक पंक्ति प्रदर्शित करता है। यह सुनिश्चित करने के लिए addslashes साथ कोई समस्या नहीं हैं, यह सुनिश्चित करने के लिए addslashes टेम्पलेट फ़िल्टर का उपयोग करता है।

अन्य पाठ-आधारित प्रारूप

ध्यान दें कि यहाँ CSV के लिए बहुत विशिष्ट नहीं है - केवल विशिष्ट आउटपुट स्वरूप। आप इनमें से किसी भी तकनीक का उपयोग किसी भी पाठ-आधारित प्रारूप को आउटपुट करने के लिए कर सकते हैं जिसका आप सपना देख सकते हैं। आप मनमाने ढंग से द्विआधारी डेटा उत्पन्न करने के लिए एक समान तकनीक का उपयोग कर सकते हैं; उदाहरण के लिए Django के साथ आउटपुट पीडीएफ देखें।