Importez plusieurs CSV, traitez-les, puis renvoyez les résultats au format CSV. Cette fois, nous allons implémenter cela en utilisant le cas suivant.
Le fichier CSV suivant est disponible dans une université.
ʻAvailable.csva des informations sur la capacité de chaque classe.
reserved.csv` contient des informations sur le nombre d'élèves qui prévoient de suivre des cours dans chaque classe.
Cette fois, si vous téléchargez ces fichiers sur le navigateur, vous allez créer une application qui télécharge un CSV qui montre l'espace actuellement disponible pour chaque classe.
Sur la face avant, il y a principalement les deux mouvements suivants. ①: téléchargement de fichier (2): Sur la base du fichier téléchargé, crachez CSV indiquant la liberté de chaque classe.
On suppose que le dossier du projet Django (myproject
) et le dossier de l'application (ʻapp`) existent déjà. Sinon, voir ici.
Cette fois, la structure des dossiers est la suivante.
├─app
│ │ admin.py
│ │ apps.py
│ │ forms.py
│ │ functions.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ __init__.py
│ │
│ ├─static
│ │ └─upload
│ │ test.txt
│ │
│ └─templates
│ index.html
│
├─myproject
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─static
│ humans.txt
│
└─staticfiles
Tout d'abord, définissez les formulaires dans forms.py
comme suit afin de pouvoir télécharger le fichier.
from django import forms
#Définir le formulaire de classe
class ClassroomForm(forms.Form):
availablity = forms.FileField()
reservation = forms.FileField()
Ensuite, afin d'afficher le formulaire créé au recto, passez le formulaire en HTML avec views.py
comme indiqué ci-dessous.
from django.shortcuts import render
from app.forms import ClassroomForm
def index(request):
###Index ClassroomForm.Passer au html
classroom = ClassroomForm()
return render(request,"index.html",{'form':classroom})
Maintenant, utilisez {{form.as_p}}
dans ʻindex.html` et extrayez le formulaire comme suit.
<body>
<form method="POST" class="post-form" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
</body>
Si vous soumettez le formulaire tel quel, les informations POSTÉES seront transmises à la méthode ʻindex de
views.py`. Donc, réécrivez «index» comme suit pour que le traitement POST soit effectué.
from django.shortcuts import render
from django.http import HttpResponse
from app.functions import process_files
from app.functions import write_into_csv
from app.forms import ClassroomForm
from django.template import loader
import csv
def index(request):
if request.method == 'POST':
classroom = ClassroomForm(request.POST, request.FILES)
#S'il y a des données dans la classe
if classroom.is_valid():
availability = request.FILES['availablity']
reservation = request.FILES['reservation']
#implement process_files
csv_data = process_files(availability, reservation)
#download result as a csv format
response = write_into_csv(csv_data)
return response
else:
###Index ClassroomForm.Passer au html
classroom = ClassroomForm()
return render(request,"index.html",{'form':classroom})
Ici, nous appelons deux méthodes, process_files
et write_into_csv
, définies dans functions.py
. Ce qui suit définit cette méthode.
Définissez la logique utilisée dans views.py
dans functions.py
.
import csv
from django.http import HttpResponse
### Process csv files
def process_files(availability, reservation):
""" Description
:type availability:
:param availability:
:type reservation:
:param reservation:
:raises:
:rtype:
"""
availability_dict = convert_to_dict(availability)
reservation_dict = convert_to_dict(reservation)
csv_data = []
courses = list(availability_dict)
for course in courses:
remaining = availability_dict[course] - reservation_dict[course]
row = [course, remaining]
csv_data.append(row)
return csv_data
def convert_to_dict(file):
""" Description
:type file:
:param file:
:raises:
:rtype:
"""
data = file.read().decode("utf-8-sig")
lines = data.split("\r\n")
dict = {}
for line in lines:
fields = line.split(",")
course = fields[0]
capacity = int(fields[1])
dict[course] = capacity
return dict
def write_into_csv(csv_data):
""" Description
:type csv_data:
:param csv_data:
:raises:
:rtype:
"""
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="download.csv"'
writer = csv.writer(response)
for row in csv_data:
writer.writerow(row)
return response
Avec ce qui précède, la fonction telle que conçue a été implémentée.
Demo
Veuillez faire comme si vous le trouvez utile.
Github https://github.com/norifumi92/csv_uploader/tree/develop
https://www.javatpoint.com/django-file-upload https://codepen.io/adamlaki/pen/VYpewx https://www.pythoncircle.com/post/30/how-to-upload-and-process-the-csv-file-in-django/ https://into-the-program.com/customize-input-type-file/ https://docs.djangoproject.com/en/3.0/topics/forms/
Recommended Posts