[PYTHON] J'ai essayé de créer le téléchargement CSV, le traitement des données, la fonction de téléchargement avec Django

Chose que tu veux faire

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.

Cas

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.

conception

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.

image.png

supposition

On suppose que le dossier du projet Django (myproject) et le dossier de l'application (ʻapp`) existent déjà. Sinon, voir ici.

Structure des dossiers

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

Création de formulaire

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()

Passer le formulaire au HTML

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> 

Traitement POST

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éfinir la logique

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 File_Upload_Demo.gif

finalement

Veuillez faire comme si vous le trouvez utile.

Github https://github.com/norifumi92/csv_uploader/tree/develop

référence

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

J'ai essayé de créer le téléchargement CSV, le traitement des données, la fonction de téléchargement avec Django
Comment créer des exemples de données CSV avec hypothèse
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai essayé de créer l'API Quip
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un traitement par lots sans serveur pour la première fois avec DynamoDB et Step Functions
J'ai essayé de créer un rapport Power BI en traitant les journaux CSV / JSON à l'aide d'Azure Databricks
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [2]. (Essayez de traiter la profondeur avec numpy)
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé l'analyse factorielle avec des données Titanic!
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé le traitement du langage naturel avec des transformateurs.
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé d'envoyer un e-mail de fin d'inscription depuis Gmail avec django.
J'ai essayé l'analyse de données IRMf avec python (Introduction au décodage des informations cérébrales)
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
Essayez d'utiliser django-import-export pour ajouter des données csv à django
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé d'intégrer Keras dans TFv1.1
Je veux frapper 100 sciences des données avec Colaboratory
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de prédire la survie du Titanic avec PyCaret
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
J'ai essayé d'étudier DP avec séquence de Fibonacci
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
J'ai essayé Django
J'ai essayé de juger Tundele avec Naive Bays
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles