"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > CSV: procesar archivos locales y remotos en Python

CSV: procesar archivos locales y remotos en Python

Publicado el 2024-08-29
Navegar:710

CSV - Process Local & Remote Files in Python

¡Hola programadores!

Este artículo presenta una herramienta de código abierto que puede procesar archivos CSV locales y remotos, cargar e imprimir la información y luego asignar la columna a Django Types. El procesamiento de archivos CSV suele ser necesario cuando el conjunto de datos aumenta, los informes personalizados no son compatibles con Excel o la manipulación completa de datos a través de tablas de datos, y se necesita API.
La lista actual de funciones se puede ampliar aún más para asignar archivos CSV a tablas/modelos de bases de datos y generar completamente aplicaciones web de panel.

Código fuente: procesador CSV que forma parte del servicio AppSeed (código abierto)


Antes de comenzar a explicar el código y el uso, resumamos las características de la herramienta:

  • cargar archivos locales y remotos
  • imprimir valores
  • imprimir tipos de columnas detectadas
  • imprimir los tipos de mapeo en un modelo Django

El analizador CSV se puede ejecutar a través de la CLI después de clonar las fuentes del proyecto y hacerlo utilizable como se explica en el archivo README. Una vez completada la instalación, podemos llamar al procesador CVS usando esta frase:

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json

La herramienta realiza las siguientes tareas:

  • validar la entrada
  • localice el archivo CSV (salga con error si no lo encuentra)
  • carga la información y detecta los tipos de columnas
  • detecta el tipo de columna de Django
  • imprimir las primeras 10 filas

Lo mismo se puede aplicar a archivos locales y remotos. Por ejemplo, podemos analizar el famoso Titanic.cvs ejecutando esta frase:

$ 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)  

Aquí están las partes relevantes de la herramienta:

Carga la información y previamente verifica la fuente si es local o remota

    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'] )

Analizar los encabezados y asignar los tipos detectados a tipos Django.

Para la vista tabular, se utiliza Tabulate Library:

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

El último paso es Imprimir los datos 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 

En este punto, el código nos proporciona acceso a la información CSV, los tipos de datos y los tipos de datos correspondientes para Django. El mapeo se puede ampliar fácilmente para cualquier marco como Flask, Express o NextJS.

El mapeo de tipos para Django es este:

# 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)',
}

Esta herramienta está en desarrollo activo y estos son los siguientes pasos:

  • conecte la herramienta a más fuentes de datos como bases de datos remotas/locales (SQLite, MySql, PgSQL), JSON
  • Generar modelos para cualquier framework: FastAPI, Flask, Express, NextJS
  • Generar API seguras en la parte superior
  • Genere tablas de datos paginadas del lado del servidor usando Tailwind/Bootstrap para diseñar

¡Gracias por leer!

Para aquellos interesados ​​en contribuir, no duden en unirse a la nueva plataforma AppSeed y conectarse con la comunidad en Discord:

  • AppSeed: plataforma de código abierto para desarrolladores
  • Comunidad AppSeed: 3.000 miembros de Discord
Declaración de liberación Este artículo se reproduce en: https://dev.to/sm0ke/csv-process-local-remote-files-in-python-3b64?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3