es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Devolver fila CSV como una lista de comprensión de lista compleja con declaraciones if”

Estoy intentando generar cada fila del CSV como una lista de int, float, str respectivamente al utilizar una comprensión de lista con declaraciones if.

¿Cómo escribo una comprensión de lista con declaraciones if que convertirá cada elemento de una fila del CSV en int, float, str respectivamente?

Problema: el float se crea como una cadena.

import csv

<p>ARCHIVO = "archivo.csv"</p>

<p>def todos_los_valores(archivo):
    with open(archivo, "r") as archivo_abierto:
        reader = csv.reader(archivo_abierto)
        for fila in reader:
            yield [
                    int(x)
                    if x.isnumeric() else float(x)
                    if x.isdecimal() else x
                    for x in fila
            ]</p>

<p>valores = [x for x in todos_los_valores(ARCHIVO)]</p>

<p>print(valores)
<code>
Problema en parte del código:
</code>python
            yield [
                    int(x)
                    if x.isnumeric() else float(x)
                    if x.isdecimal() else x
                    for x in fila
            ]
<code>
Archivo:
</code>none
100,"Jin",10.56
200,"Tonic",15.99
300,"Vodka",20.39
<code>
Resultado:
</code>none
[[100, 'Jin', '10.56'], [200, 'Tonic', '15.99'], [300, 'Vodka', '20.39']]

Tipo incorrecto de valores:

'10.56', '15.99', '20.39'

Gracias por su tiempo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para convertir cada elemento de una fila CSV en int, float o str según su tipo, puedes usar la siguiente comprensión de lista con declaraciones if:

    import csv
    
    ARCHIVO = "file.csv"
    
    def todos_los_valores(archivo):
        with open(archivo, "r") as archivo_abierto:
            lector = csv.reader(archivo_abierto)
            for fila in lector:
                yield [
                        int(x)
                        if x.isnumeric() else float(x)
                        if "." in x else x
                        for x in fila
                ]
    
    valores = [x for x in todos_los_valores(ARCHIVO)]
    
    print(valores)
    

    En esta comprensión de lista, primero verificamos si el elemento x es numérico utilizando el método isnumeric(). Si es así, lo convertimos a int. Si no lo es, verificamos si el elemento contiene un punto decimal utilizando "." in x. Si es así, lo convertimos a float. De lo contrario, lo dejamos como una cadena de texto.

    Tenga en cuenta que verificamos un punto decimal utilizando "." in x en lugar de x.isdecimal() porque isdecimal() solo es True para cadenas que contienen solo dígitos decimales (0-9), mientras que queremos manejar también cadenas que contienen un punto decimal, como “10.5”.

    Con esta comprensión de lista, obtenemos la siguiente salida:

    [[100, 'Jin', 10.56], [200, 'Tonic', 15.99], [300, 'Vodka', 20.39]]
    

    Aquí, los valores numéricos se convierten correctamente en int o float, y los valores de cadena permanecen como cadenas.

Comments are closed.