„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > CSV – Lokale und Remote-Dateien in Python verarbeiten

CSV – Lokale und Remote-Dateien in Python verarbeiten

Veröffentlicht am 29.08.2024
Durchsuche:470

CSV - Process Local & Remote Files in Python

Hallo Programmierer!

In diesem Artikel wird ein Open-Source-Tool vorgestellt, das lokale und Remote-CSV-Dateien verarbeiten, die Informationen laden und drucken und die Spalte später Django-Typen zuordnen kann. Die Verarbeitung von CSV-Dateien ist normalerweise erforderlich, wenn der Datensatz groß wird, benutzerdefinierte Berichte von Excel nicht unterstützt werden oder eine vollständige Datenbearbeitung über Datentabellen erfolgt und eine API erforderlich ist.
Die aktuelle Liste der Funktionen kann weiter erweitert werden, um CSV-Dateien Datenbanktabellen/-modellen zuzuordnen und Dashboard-Webanwendungen vollständig zu generieren.

Quellcode: CSV-Prozessor-Teil des AppSeed-Dienstes (Open-Source)


Bevor wir mit der Erläuterung des Codes und der Verwendung beginnen, fassen wir die Funktionen des Tools zusammen:

  • Lokale und Remote-Dateien laden
  • Werte drucken
  • erkannte Spaltentypen drucken
  • Drucken Sie die Zuordnungstypen in ein Django-Modell

Der CSV-Parser kann über die CLI ausgeführt werden, nachdem die Projektquellen geklont und wie in der README-Datei erläutert nutzbar gemacht wurden. Sobald die Installation abgeschlossen ist, können wir den CVS-Prozessor mit diesem Einzeiler aufrufen:

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json

Das Tool führt die folgenden Aufgaben aus:

  • Validieren Sie die Eingabe
  • Suchen Sie die CSV-Datei (mit Fehler beenden, wenn sie nicht gefunden wird)
  • lädt die Informationen und erkennt die Spaltentypen
  • erkennt den Django-Spaltentyp
  • drucken Sie die ersten 10 Zeilen

Dasselbe kann auf lokale und Remote-Dateien angewendet werden. Zum Beispiel können wir die berüchtigte Titanic.cvs analysieren, indem wir diesen Einzeiler ausführen:

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect_distant.json

# Output
> Processing .\media\tool_inspect\csv_inspect_distant.json
    |-- file: https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv
    |-- type: csv


Field        CSV Type    Django Types
-----------  ----------  ------------------------------------------
PassengerId  int64       models.IntegerField(blank=True, null=True)
Survived     int64       models.IntegerField(blank=True, null=True)
Pclass       int64       models.IntegerField(blank=True, null=True)
Name         object      models.TextField(blank=True, null=True)
Sex          object      models.TextField(blank=True, null=True)
Age          float64     models.FloatField(blank=True, null=True)
SibSp        int64       models.IntegerField(blank=True, null=True)
Parch        int64       models.IntegerField(blank=True, null=True)
Ticket       object      models.TextField(blank=True, null=True)
Fare         float64     models.FloatField(blank=True, null=True)
Cabin        object      models.TextField(blank=True, null=True)
Embarked     object      models.TextField(blank=True, null=True)


[1] - PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
[2] - 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
[3] - 2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
[4] - 3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
[5] - 4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
[6] - 5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
[7] - 6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
[8] - 7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S
[9] - 8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S
[10] - 9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S
... (truncated output)  

Hier sind die relevanten Teile des Tools:

Lädt die Informationen und prüft vorab, ob die Quelle lokal oder entfernt ist

    print( '> Processing '   ARG_JSON )
    print( '    |-- file: '   JSON_DATA['source'] )
    print( '    |-- type: '   JSON_DATA['type'  ] )
    print( '\n')

    tmp_file_path = None 

    if 'http' in JSON_DATA['source']:
        url = JSON_DATA['source']
        r = requests.get(url)
        tmp_file = h_random_ascii( 8 )   '.csv'
        tmp_file_path = os.path.join( DIR_TMP, tmp_file )
        if not file_write(tmp_file_path, r.text ):
            return
        JSON_DATA['source'] = tmp_file_path
    else:    
        if not file_exists( JSON_DATA['source'] ):
            print( ' > Err loading SOURCE: '   JSON_DATA['source'] )            
            return

    csv_types = parse_csv( JSON_DATA['source'] )

Analysieren Sie die Header und ordnen Sie die erkannten Typen Django-Typen zu.

Für die tabellarische Ansicht wird Tabulate Library verwendet:

    csv_types = parse_csv( JSON_DATA['source'] )

    #pprint.pp ( csv_types )

    table_headers = ['Field', 'CSV Type', 'Django Types']
    table_rows    = []

    for t in csv_types:
        t_type        = csv_types[t]['type']
        t_type_django = django_fields[ t_type ]
        table_rows.append( [t, t_type, t_type_django] )

    print(tabulate(table_rows, table_headers))

Der letzte Schritt besteht darin, die CSV-Daten zu drucken:

    csv_data = load_csv_data( JSON_DATA['source'] )

    idx = 0
    for l in csv_data:
        idx  = 1
        print( '[' str(idx) '] - '   str(l) )  

        # Truncate output ..
        if idx == 10:
            print( ' ... (truncated output) ' ) 
            break 

An dieser Stelle bietet uns der Code Zugriff auf die CSV-Informationen, Datentypen und die entsprechenden Datentypen für Django. Das Mapping kann problemlos für jedes Framework wie Flask, Express oder NextJS erweitert werden.

Die Typzuordnung für Django ist diese:

# Pandas Type
django_fields = {
    'int'           : 'models.IntegerField(blank=True, null=True)',
    'integer'       : 'models.IntegerField(blank=True, null=True)',
    'string'        : "models.TextField(blank=True, null=True)",
    'string_unique' : "models.TextField(blank=True, null=False, unique=True)",
    'object'        : "models.TextField(blank=True, null=True)",
    'object_unique' : "models.TextField(blank=True, null=False, unique=True)",
    'int64'         : 'models.IntegerField(blank=True, null=True)',
    'float64'       : 'models.FloatField(blank=True, null=True)',
    'bool'          : 'models.BooleanField(null=True)',
}

Dieses Tool befindet sich in der aktiven Entwicklung und hier sind die nächsten Schritte:

  • Verbinden Sie das Tool mit weiteren Datenquellen wie entfernten/lokalen Datenbanken (SQLite, MySql, PgSQL), JSON
  • Generieren Sie Modelle für jedes Framework: FastAPI, Flask, Express, NextJS
  • Generieren Sie darüber hinaus sichere APIs
  • Generieren Sie serverseitig paginierte Datentabellen mit Tailwind/Bootstrap für das Styling

Danke fürs Lesen!

Für diejenigen, die daran interessiert sind, einen Beitrag zu leisten, können Sie sich gerne der neuen AppSeed-Plattform anschließen und sich mit der Community auf Discord vernetzen:

  • AppSeed – Open-Source-Plattform für Entwickler
  • AppSeed-Community – 3.000 Discord-Mitglieder
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/sm0ke/csv-process-local-remote-files-in-python-3b64?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3