Heim > Artikel > Backend-Entwicklung > CSV – Lokale und Remote-Dateien in Python verarbeiten
Hallo Programmierer!
In diesem Artikel wird ein Open-Source-Tool vorgestellt, das lokale und Remote-CSV-Dateien verarbeiten kann, 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 beginnen, den Code und die Verwendung zu erklären, 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 folgende 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 auszudrucken:
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 diesem Punkt 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!
Wenn Sie 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:
Das obige ist der detaillierte Inhalt vonCSV – Lokale und Remote-Dateien in Python verarbeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!