"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > CSV - Traiter les fichiers locaux et distants en Python

CSV - Traiter les fichiers locaux et distants en Python

Publié le 2024-08-29
Parcourir:656

CSV - Process Local & Remote Files in Python

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 :

  • charger des fichiers locaux et distants
  • imprimer les valeurs
  • imprimer les types de colonnes détectés
  • imprimer les types de mappage sur un modèle Django

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 :

  • valider la saisie
  • localisez le fichier CSV (quittez avec une erreur s'il n'est pas trouvé)
  • charge les informations et détecte les types de colonnes
  • détecte le type de colonne Django
  • imprimer les 10 premières lignes

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 :

  • connectez l'outil à davantage de sources de données telles que des bases de données distantes/locales (SQLite, MySql, PgSQL), JSON
  • Générer des modèles pour n'importe quel framework : FastAPI, Flask, Express, NextJS
  • Générez des API sécurisées en plus
  • Générer des DataTables paginées côté serveur à l'aide de Tailwind/Bootstrap pour le style

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 :

  • AppSeed - plateforme open source pour les développeurs
  • Communauté AppSeed - 3 000 membres Discord
Déclaration de sortie Cet article est reproduit sur : https://dev.to/sm0ke/csv-process-local-remote-files-in-python-3b64?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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