Python: ¿Cómo puedo leer los caracteres de una línea en un archivo y convertirlos a flotantes y strs, dependiendo de si son números o letras?

Tengo un archivo que se parece a:

1 1 CC 1.9873 2.347 3.88776 1 2 C Si 4.887 9.009 1.21 

Me gustaría leer en el contenido del archivo, línea por línea. Cuando solo tenía números en las líneas usaba:

 for line in readlines(file): data = map(float, line.split) 

Pero esto solo funciona cuando todos los elementos de line.split son números. ¿Cómo puedo hacer que almacene las letras como cadenas y los números como flotadores?

 for line in infile: data = [x if x.isalpha() else float(x) for x in line.split()] 

Habrá problemas si sus datos contienen campos que no son ni alfabéticos ni números de punto flotante válidos (por ejemplo, “A1”). Sus datos no parecen tener estos de lo que usted dijo, pero si los tiene, el enfoque try/except sugerido por Igor probablemente se adapte mejor.

Probablemente usaría una función más genérica a la que se le pueden dar los tipos para probar, sin embargo:

 def tryconvert(value, *types): for t in types: try: return t(value) except (ValueError, TypeError): continue return value for line in infile: data = [tryconvert(x, int, float) for x in line.split()] 

Esto convertirá cualquier cosa que se convierta en un entero en un int , y en su defecto intentará float , y finalmente, simplemente se da por vencido y devuelve el valor original, que sabemos que será una cadena. (Si no supiéramos que era una cadena, podríamos simplemente pegar str al final de nuestra llamada a tryconvert() .)

 $ cat 1.py def float_or_str(x): try: return float(x) except ValueError: return x line = '1 1 CC 1.9873 2.347 3.88776' print map(float_or_str, line.split()) $python 1.py [1.0, 1.0, 'C', 'C', 1.9873, 2.347, 3.88776] 

Puedes usar los métodos str.isalpha (), str.isalphanum (), str.isdigit para decidir si tu cadena es un número o no.