Mengeluarkan CSV dengan Django¶
Dokumen ini menjelaskan bagaimana keluaran CSV (Comma Separated Values) secara dinamis menggunakan tampilan Django. Untuk melakukan ini, anda dapat salah satu menggunakan pustaka CSV Python atau sistem cetakan Django.
Menggunakan pustaka CSV Python¶
Python datang dengan pustaka CSV, csv
. Kunci menggunakannya dengan Django adalah csv
kemampuan modul pembuatan-CSV bertindak pada obyek seperti-berkas, dan obyek HttpResponse
Django adalah obyek seperti-berkas.
Ini adalah sebuah contoh:
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
Kode dan komentar seharunya sudah cukup jelas, tetapi sedikit hal pantas disebut:
- Tanggapan mendapatkan jenis MIME khusus, mimetype:text/csv. Ini memberitahu perambah bahwa dokumen adalah sebuah berkas CSV, daripada sebuah berkas HTML. Jika anda mengosongkan ini, perambah akan kemungkinan mentafsirkan keluaran sebagai HTML, yang akan menghasilkan buruk, uraian berbelit-belit yang menakutkan dalam jendela perambah.
- Tanggapan mendapatkan sebuah kepala
Content-Disposition
tambahan, yang mengandung nama dari berkas CSV. Berkas nama ini berubah-ubah; panggil dia kapanpun anda inginkan. DIa akan digunakan oleh perambah dalam dialog "Save as...", dll. - Mengait kedalam API pembangkitan-CSV adalah mudah: Cukup lewatkan
response
sebagai argumen eprtama padacsv.writer
. Fungsicsv.writer
mengharapkan obyek berkas-seperti, dan obyekHttpResponse
cocok dengan tagihan. - Untuk setiap baris di berkas CSV anda, panggil
writer.writerow
, lewatkan dia obyek berputar seperti sebuah daftar atau tuple. - Modul CSV merawat dari mengutip untuk anda, jadi jangan khawatir tentang pelolosan deretan karakter dengan kutip atau koma di dalamnya. Cukup lewatkan writerow()` deretan karakter mentah anda, dan dia akan melakukan hal benar.
Menangani Unicode di Python 2
Modul csv
Python2 tidak mendukung masukan Unicode. Sejak Django menggunakan Unicode secara internal in iberarti deretan karakter dibaca dari sumber seperti class:~django.http.HttpRequest adalah berpotensi bermasalah. Ada sedikit pilihan untuk menangani ini:
- Secara manual menyandi semua obyek Unicode ke penyandian yang cocok.
- Gunakan kelas
UnicodeWriter
disediakan di csv module's examples section. - Gunakan python-unicodecsv module, yang menuju untuk menjadi pengganti untuk
csv
yang anggun menangani Unicode.
Untuk info lebih lanjut, lihat dokumentasi Python di modul csv
.
Mengalirkan berkas-berkas CSV besar¶
Ketika berurusan dengan tampilan yang membangkitkan tanggapan yang sangat besar, anda mungkin ingin mempertimbangkan menggunakan StreamingHttpResponse
Django. Sebagai contoh, dengan mengalirkan sebuah berkas yang memakan waktu lama untuk membangkitkan anda dapat menghindari penyeimbang memuat menjatuhkan hubungan yang mungkin telah dinyatakan habis selagi peladen membangkitkan tanggapan.
Dalam contoh ini, kami membuat penggunaan penuh dari pembangkit Python untuk secara efisien menangani rakitan dan perpindahan dari berkas CSV besar:
import csv
from django.utils.six.moves import range
from django.http import StreamingHttpResponse
class Echo(object):
"""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
Menggunakan sistem cetakan¶
Kalau tidak, anda dapat menggunakan Django template system untuk membangkitkan CSV. Ini adalah tingkatan lebih rendah daripada menggunakan modul csv
mudah Python, tetapi pemecahannya adalah membawakannya kesini untuk kelengkapan.
Ide disini adalah melewatkan sebuah daftar dari barang-barang ke cetakan anda, dan mempunyai keluaran cetakan koma di for
untuk berulang.
Ini adalah contoh, yang akan membangkitkan berkas CSV sama seperti diatas:
from django.http import HttpResponse
from django.template import loader, Context
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
Satu-satunya perbedaan diantara contoh ini dan contoh sebelumnya adalah bahwa satu ini menggunakan cetakan memuat daripada modul CSV. Sisa dari kode -- seperti content_type='text/csv'
-- adalah sama.
Kemudian, buat cetakan my_template_name.txt
, dengan kode cetakan ini:
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}
Cetakan ini sangat dasar. Dia hanya berulang terhadap data yang diberikan dan menampilkan sebuah baris dari CSV untuk setiap baris. Dia menggunakan cetakan penyaring addslashes
untuk memastikan tidak ada masalah dengan kutipan.
Format berbasis teks lainnya¶
Perhatikan bahwa tidak ada banyak spesifik pada CSV disini -- cukup bentuk keluaran spesifik. Anda dapat menggunakan salah satu dari teknik ini untuk mengeluarkan bentuk berdasarkan-teks apapun anda impikan. Anda dapat juga menggunakan teknik yang mirip untuk membangkitkan data biner berubah-ubah; lihat Mengeluarkan PDF dengan Django untuk sebuah contoh.