Bonjour les codeurs !
Cet article présente un outil open source capable de traiter des fichiers CSV locaux et distants, de charger et d'imprimer les informations, puis de mapper la colonne aux types Django. Le traitement des fichiers CSV est généralement requis lorsque l'ensemble de données devient volumineux, que les rapports personnalisés ne sont pas pris en charge par Excel ou la manipulation complète des données via des tableaux de données et qu'une API est nécessaire.
La liste actuelle des fonctionnalités peut être étendue pour mapper les fichiers CSV aux tables/modèles de base de données et générer entièrement des applications Web de tableau de bord.
Code source : processeur CSV faisant partie du service AppSeed (open-source)
Avant de commencer à expliquer le code et son utilisation, résumons les fonctionnalités de l'outil :
L'analyseur CSV peut être exécuté via la CLI après avoir cloné les sources du projet et l'avoir rendu utilisable comme expliqué dans le README. Une fois l'installation terminée, nous pouvons appeler le processeur CVS en utilisant cette one-liner :
$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json
L'outil effectue les tâches suivantes :
La même chose peut être appliquée aux fichiers locaux et distants. Par exemple, nous pouvons analyser le fameux Titanic.cvs en exécutant ce one-liner :
$ 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)
Voici les parties pertinentes de l'outil :
Charge les informations et vérifie au préalable si la source est locale ou distante
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'] )
Analysez les en-têtes et mappez les types détectés aux types Django.
Pour la vue tabulaire, Tabulate Library est utilisé :
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))
La dernière étape consiste à Imprimer les données CSV :
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
À ce stade, le code nous donne accès aux informations CSV, aux types de données et aux types de données correspondants pour Django. Le mappage peut être facilement étendu pour n'importe quel framework comme Flask, Express ou NextJS.
Le mappage de type pour Django est celui-ci :
# 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)', }
Cet outil est en cours de développement actif et voici les prochaines étapes :
Merci d'avoir lu !
Pour ceux qui souhaitent contribuer, n'hésitez pas à rejoindre la nouvelle plateforme AppSeed et à vous connecter avec la communauté sur Discord :
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3