2013-03-22 18 views
13

Ho un file di dati con colonne comeConserva spazi bianchi utilizzando split() e join() in pitone

BBP1 0.000000 -0.150000 2.033000 0.00 -0.150 1.77 

e le singole colonne sono separati da un numero variabile di spazi bianchi.

Il mio obiettivo è quello di leggere in quelle righe, fare alcuni calcoli su più righe, ad esempio moltiplicando la colonna 4 per .95, e scriverle in un nuovo file. Il nuovo file dovrebbe assomigliare a quello originale, ad eccezione dei valori che ho modificato.

Il mio approccio sarebbe leggere nelle righe come elementi di una lista. E poi userei split() su quelle file che mi interessano, che mi daranno una sottolista con i valori delle singole colonne. Quindi faccio la modifica, join() le colonne e scrivo le righe dalla lista in un nuovo file di testo.

Il problema è che ho la quantità variabile di spazi bianchi. Non so come reinserirli nello stesso modo in cui li ho letti. L'unico modo in cui potrei pensare è contare i caratteri nella riga prima di dividerli, il che sarebbe molto noioso. Qualcuno ha un'idea migliore per affrontare questo problema?

+0

se il file è in un formato fisso, quindi utilizzando lo stesso numero di spazi è possibile modificare le larghezze delle colonne. È possibile utilizzare la formattazione di stringhe per preservare il formato del file, ad esempio, "" {: 4s} {: 10.6f} {: 10.6f} {: 11.6f} {: 5.2f} {: 6.3f} {: 6.2f} ". format (* row) ', dove' row = ["BBP1", 0.0, -0.15, 0.95 * 2.033, 0.0, -0.15, 1.77] '. – jfs

risposta

18

si desidera utilizzare re.split() in quel caso, con un gruppo:

re.split(r'(\s+)', line) 

sarebbero tornati entrambe le colonne e lo spazio bianco in modo da poter riprendere la linea più tardi con la stessa quantità di spazi bianchi inclusi.

Esempio:

>>> re.split(r'(\s+)', line) 
['BBP1', ' ', '0.000000', ' ', '-0.150000', ' ', '2.033000', ' ', '0.00', ' ', '-0.150', ' ', '1.77'] 

Probabilmente Non desidera rimuovere il newline dalla fine.

+0

Grazie, questo funziona come per magia! –

-1

Altro modo per farlo è:

s = 'BBP1 0.000000 -0.150000 2.033000 0.00 -0.150 1.77' 
s.split(' ') 
>>> ['BBP1', '', '', '0.000000', '', '-0.150000', '', '', '', '2.033000', '', '0.00', '-0.150', '', '', '1.77'] 

Se specifichiamo argomento carattere di spazio in funzione split, si crea la lista senza mangiare caratteri di spazio successivi. Quindi, i numeri originali di caratteri spaziali vengono ripristinati dopo la funzione 'join'.

Problemi correlati