2009-11-29 12 views
41
e = ('ham', 5, 1, 'bird') 
logfile.write(','.join(e)) 

Devo unirmi per poterlo scrivere in un file di testo.Perché non posso unirmi a questa tupla in Python?

+10

BTW, lo sapevi? puoi scrivere la tua prima riga senza le parentesi? È bello fare a meno di ciò che è essenzialmente rumore. – djc

risposta

85

join richiede solo liste di stringhe, in modo da convertirli prima

>>> e = ('ham', 5, 1, 'bird') 
>>> ','.join(map(str,e)) 
'ham,5,1,bird' 

o forse più divinatorio

>>> ','.join(str(i) for i in e) 
'ham,5,1,bird' 
+4

utilizzando str() anziché repr() può causare PERDITA DI INFORMAZIONI. –

+1

Dipende da quale sia il tuo scopo, ma 'str()' è generalmente ciò che vuoi mostrare all'utente (cioè in un logfile che era ciò che l'OP voleva). –

+1

Infatti. str (__str__ o meglio, __unicode__) è per gli umani. E la domanda indica un file di registro, che è per gli umani. Quindi in questo caso penso che str() sia migliore di __repr__. – extraneon

10

join() funziona solo con stringhe, non con numeri interi. Utilizzare ','.join(str(i) for i in e).

+0

Il commento sulle tuple senza parentesi è ottimo. –

3

utilizzare il modulo csv. Salva una domanda successiva su come gestire gli elementi contenenti una virgola, seguita da un'altra sulla gestione degli elementi contenenti il ​​carattere che hai usato per citare/sfuggire le virgole.

import csv 
e = ('ham', 5, 1, 'bird') 
with open('out.csv', 'wb') as f: 
    csv.writer(f).writerow(e) 

lo controlla:

print open('out.csv').read() 

uscita:

ham,5,1,bird 
+3

Sembra inutilmente complicato. –

+1

@LS: Tutto non è quello che sembra. Semplicisticamente usando i separatori di virgola senza preoccuparsi di sfuggire alle virgole, ecc., Si sblocca molto velocemente. –

4

Si potrebbe essere meglio semplicemente convertire il tuple a una lista prima:

e = ('ham', 5, 1, 'bird') liste = list(e) ','.join(liste)

Problemi correlati