Maison  >  Article  >  développement back-end  >  CSV - Traiter les fichiers locaux et distants en Python

CSV - Traiter les fichiers locaux et distants en Python

WBOY
WBOYoriginal
2024-08-28 18:30:37486parcourir

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 types 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 en utilisant 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 - Plus de 3 000 membres Discord

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn