“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.
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:
En esta comprensión de lista, primero verificamos si el elemento
x
es numérico utilizando el métodoisnumeric()
. Si es así, lo convertimos aint
. Si no lo es, verificamos si el elemento contiene un punto decimal utilizando"." in x
. Si es así, lo convertimos afloat
. De lo contrario, lo dejamos como una cadena de texto.Tenga en cuenta que verificamos un punto decimal utilizando
"." in x
en lugar dex.isdecimal()
porqueisdecimal()
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:
Aquí, los valores numéricos se convierten correctamente en
int
ofloat
, y los valores de cadena permanecen como cadenas.