[PYTHON] Ich habe versucht, mit Django eine CSV-Upload-, Datenverarbeitungs- und Download-Funktion zu erstellen

Was du machen willst

Importieren Sie mehrere CSVs, verarbeiten Sie sie und geben Sie die Ergebnisse im CSV-Format zurück. Dieses Mal werden wir dies anhand des folgenden Falls implementieren.

Fall

Das folgende CSV ist an einer Universität erhältlich. available.csv enthält Informationen darüber, wie viel Kapazität jede Klasse hat. reserved.csv enthält Informationen darüber, wie viele Schüler in jeder Klasse Unterricht nehmen möchten. Wenn Sie diese Dateien dieses Mal im Browser hochladen, erstellen Sie eine App, die eine CSV herunterlädt, die anzeigt, wie viel Speicherplatz jede Klasse derzeit hat.

Design

Auf der Vorderseite gibt es hauptsächlich die folgenden zwei Bewegungen. ①: Datei hochladen (2): Spucken Sie basierend auf der hochgeladenen Datei die CSV aus, die die Freiheit jeder Klasse angibt.

image.png

Annahme

Es wird davon ausgegangen, dass der Django-Projektordner (myproject) und der App-Ordner ( app) bereits vorhanden sind. Wenn nicht, siehe hier.

Ordnerstruktur

Diesmal ist die Ordnerstruktur wie folgt.

├─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

Formularerstellung

Definieren Sie zunächst die Formulare in forms.py wie folgt, damit Sie die Datei hochladen können.

from django import forms
#Klassenzimmerformular definieren
class ClassroomForm(forms.Form):    
    availablity = forms.FileField() 
    reservation = forms.FileField()

Übergeben Sie das Formular an HTML

Um das erstellte Formular auf der Vorderseite anzuzeigen, übergeben Sie das Formular wie unten gezeigt mit "views.py" an HTML.

from django.shortcuts import render  
from app.forms import ClassroomForm  

def index(request): 
    ###Index ClassroomForm.Übergabe an HTML
    classroom = ClassroomForm()  
    return render(request,"index.html",{'form':classroom}) 

Verwenden Sie nun "{{form.as_p}}" in "index.html" und ziehen Sie das Formular wie folgt.

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

Nachbearbeitung

Wenn Sie das Formular so senden, wie es ist, werden die POST-Informationen an die Indexmethode von views.py übergeben. Schreiben Sie den Index also wie folgt um, damit die POST-Verarbeitung ausgeführt wird.

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)
        #Wenn sich Daten im Klassenzimmer befinden
        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.Übergabe an HTML
        classroom = ClassroomForm()  
        
        return render(request,"index.html",{'form':classroom})  

Hier rufen wir zwei Methoden auf, "process_files" und "write_into_csv", die in "functions.py" definiert sind. Im Folgenden wird diese Methode definiert.

Logik definieren

Definieren Sie die in views.py verwendete Logik in 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

Mit dem oben Gesagten wurde die entworfene Funktion implementiert.

Demo File_Upload_Demo.gif

Schließlich

Bitte tun Sie gerne, wenn Sie es hilfreich finden.

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

Referenz

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

Ich habe versucht, mit Django eine CSV-Upload-, Datenverarbeitungs- und Download-Funktion zu erstellen
Erstellen von CSV-Beispieldaten mit Hypothese
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, einen Pandas-Datenrahmen zu erstellen, indem ich mit Python Informationen zum Lebensmittelrückruf abgekratzt habe
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe zum ersten Mal versucht, mit DynamoDB und Step Functions eine serverlose Stapelverarbeitung zu erstellen
Ich habe versucht, einen Power BI-Bericht zu erstellen, indem ich CSV / JSON-Protokolle mit Azure Databricks verarbeitet habe
Ich habe versucht, mit einem Foto einfach ein hochpräzises 3D-Bild zu erstellen [2]. (Versuchen Sie die Verarbeitungstiefe mit numpy)
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Entwicklung] (2/3) zu erstellen.
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Ausführung] (3/3) zu erstellen.
Ich habe versucht, mit django eine E-Mail zum Abschluss der Registrierung von Google Mail zu senden.
Ich habe versucht, fMRI-Daten mit Python zu analysieren (Einführung in die Dekodierung von Gehirninformationen)
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Setup] (1/3) zu erstellen.
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Versuchen Sie, mit django-import-export csv-Daten zu django hinzuzufügen
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Schreiben Sie CSV-Daten mit AWS-Lambda + Python in AWS-S3
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe es mit Django versucht
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert