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