2010-09-15 19 views
7

Si almaceno un valor booleano usando el módulo CSV, se convierte a las cadenas 'Verdadero' o 'Falso' por la función str(). Sin embargo, cuando cargo esos valores, una cadena de 'False' se evalúa como True porque es una cadena no vacía.Cuál es una manera conveniente de almacenar y recuperar valores booleanos en un archivo CSV

Puedo solucionarlo 'manualmente' comprobando la cadena en el tiempo de lectura con una instrucción IF para ver qué es la cadena, pero es algo menos que elegante. ¿Alguna idea mejor, o es solo una de esas cosas en el mundo de la programación?

+0

"One of that things"? Una de * qué * cosas? –

+0

¡En el nivel inferior, Python simplemente haría esa declaración IF de la que está hablando! – fjsj

+1

@ S.Lott: cosas molestas. @fjsj: Es cierto, pero me gustaría ocultar el IF de la vista. Creo que he encontrado una forma conveniente de hacerlo, pero me pregunto si alguien más ha tratado este tema. –

Respuesta

4

No creo que esto sea posible con el módulo csv de Python. Sin embargo ...

Al decir que ambos escriben y leen el archivo CSV de Python, está admitiendo que está usando un archivo CSV para algún tipo de serialización de datos. ¿Por qué querrías hacer eso? Hay muchas mejores opciones para serializar datos de Python, y los archivos CSV deberían ser reservados en mi humilde opinión para interactuar con otras herramientas que los requieran por alguna razón.

+3

Los usuarios deberían poder ver y manupular los datos en la aplicación Python o Excel de manera intercambiable, con flujos de trabajo que van y vienen entre los dos. –

+2

@Simon: ¿ofrecen interoperabilidad de Excel real o solo para editar valores simples? Es difícil imaginar que su aplicación Python permita algo más complejo que eso, en cuyo caso no necesita Excel, pero puede presentar los datos a los usuarios en una tabla editable simple creada con una estructura Python GUI –

+0

Tengo una vista de tabla en la aplicación Python, pero existen herramientas de Excel preexistentes para este tipo de datos y es muy probable que los usuarios de los datos estén familiarizados con Excel y quieran usarlo. También existen aplicaciones de bases de datos preexistentes para este tipo de datos y también necesito poder tener una ruta de interoperabilidad con ellos. CSV me parece que es un formato intermedio razonable. –

0

utilice la función int() para ocultar el booleano a sus valores int y luego almacenarlos. Dicho esto, vale la pena mencionar el comentario de eli-bendersky.

+0

Lo consideré, pero el valor almacenado en el archivo CSV debe ser fácilmente analizable por el ojo humano. Si solo lo estuviera almacenando para el procesamiento de la máquina, no estaría usando un archivo CSV y el comentario de Eli sería perfecto. –

0

No estoy seguro de si responder su propia pregunta es incorrecta o no, pero esta es la solución que he ideado. Básicamente consiste en pasar esa molesta declaración IF de la que estaba hablando a una función.

def setyesNo(value): 
    if value: return 'Yes' 
    else: return 'No' 

def checkYesNo(text): 
    if text == 'Yes': return True 
    else: return False 

Then in my dictWriter hacer esto.

for item in mylist: 
    writer.writerow({'Is Cool' : setYesNo(item.is_cool), 
         ..... 
         }) 

Y en dictReader.

for line in reader: 
    item MyObject(is_Cool=checkYesNo(line['Is Cool']), 
        ..... 
       ) 
    mylist.append(item) 
Cuestiones relacionadas