2010-09-15 12 views
7

Se memorizzo un valore booleano utilizzando il modulo CSV, viene convertito nelle stringhe "True" o "False" dalla funzione str(). Tuttavia, quando carico questi valori, una stringa di "False" viene valutata come True perché è una stringa non vuota.Che cosa è un modo conveniente per archiviare e recuperare valori booleani in un file CSV

Posso aggirarlo con 'manualy' controllando la stringa in fase di lettura con un'istruzione IF per vedere qual è la stringa, ma è un po 'meno elegante. Qualche idea migliore, o è solo una di quelle cose nel mondo della programmazione?

+0

"Una di quelle cose"? Una delle cose * cosa *? –

+0

Al livello più basso, Python farebbe semplicemente quella dichiarazione IF di cui si sta parlando! – fjsj

+1

@ S.Lott: cose fastidiose. @fjsj: vero ma mi piacerebbe nascondere l'IF dalla vista. Penso di aver trovato un modo conveniente per farlo, ma mi chiedevo se qualcun altro avesse riscontrato questo problema. –

risposta

4

Non penso che questo sia possibile con il modulo csv di Python. Tuttavia ...

Dicendo che entrambi scrivete e leggete il file CSV da Python, state ammettendo di usare un file CSV per qualche tipo di serializzazione dei dati. Perché vorresti farlo? Esistono molte migliori opzioni per serializzare i dati Python e i file CSV dovrebbero essere riservati all'interazione con altri strumenti che li richiedono per qualche motivo.

+3

Gli utenti dovrebbero essere in grado di visualizzare e gestire i dati nell'applicazione Python o in Excel in modo intercambiabile, con flussi di lavoro che vanno avanti e indietro tra i due. –

+2

@Simon: offrite l'effettiva interoperabilità di Excel o è solo per la modifica di valori semplici? È difficile immaginare la tua app Python che consenta qualcosa di più complesso, nel qual caso non hai davvero bisogno di Excel ma puoi presentare i dati agli utenti in una semplice tabella modificabile creata con qualche framework GUI Python –

+0

Ho una vista tabella in l'app Python, ma esistono strumenti Excel preesistenti per questo tipo di dati e gli utenti dei dati hanno molta familiarità con Excel e vogliono usarlo. esistono anche applicazioni di database preesistenti per questo tipo di dati e devo anche essere in grado di avere un percorso verso l'interoperabilità con loro. CSV mi sembra un formato intermedio ragionevole. –

0

utilizzare la funzione int() per nascondere il valore booleano ai rispettivi valori int e quindi memorizzarli. Detto questo, il commento di eli-bendersky sopra è degno di nota.

+0

L'ho considerato, ma il valore memorizzato nel file CSV deve essere facilmente analizzabile dall'occhio umano. Se stavo semplicemente memorizzandolo per l'elaborazione della macchina, non userei un file CSV e il commento di Eli sarebbe azzeccato. –

0

Non sono sicuro che rispondere alla propria domanda sia una cattiva forma oppure no, ma ecco la soluzione che ho trovato. Fondamentalmente consiste nel rinunciare a quella fastidiosa affermazione dell'IF di cui stavo parlando in una funzione.

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

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

Quindi nel mio dittatore fare questo.

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

E in dictReader.

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