2013-06-11 13 views
25

Ho un file che contiene valori separati da tab ("\ t"). Sto cercando di creare un elenco e memorizzare tutti i valori del file nell'elenco. Ma ho qualche problema. Ecco il mio codice.divisione di una stringa in base alla scheda nel file

line = "abc def ghi" 
values = line.split("\t") 

Funziona bene finché c'è solo una scheda tra ciascun valore. Ma se c'è una sola scheda, copia anche la tabella in valori. Nel mio caso per lo più la tabulazione aggiuntiva sarà dopo l'ultimo valore nel file. Qualcuno può aiutarmi.

+2

ci sono altri spazi nella vostra valori che dovrebbe * non * essere diviso? Perché se così non fosse, si potrebbe semplicemente usare 'line.split()', e si prenderà cura di questo (oltre a scartare gli elementi iniziali/finali vuoti). –

risposta

45

È possibile utilizzare regex qui:

>>> import re 
>>> strs = "foo\tbar\t\tspam" 
>>> re.split(r'\t+', strs) 
['foo', 'bar', 'spam'] 

aggiornamento:

È possibile utilizzare str.rstrip per sbarazzarsi di ultimi '\t' e quindi applicare regex.

>>> yas = "yas\t\tbs\tcda\t\t" 
>>> re.split(r'\t+', yas.rstrip('\t')) 
['yas', 'bs', 'cda'] 
+0

Meglio del mio approccio di filtro +1 –

+0

ma come si tratterà se abbiamo la scheda alla fine del file. Prenderà comunque un valore vuoto. – hjelpmig

+0

@ yasra002 per favore pubblica un esempio. –

4

È possibile utilizzare espressioni regolari per fare questo:

import re 
patt = re.compile("[^\t]+") 


s = "a\t\tbcde\t\tef" 
patt.findall(s) 
['a', 'bcde', 'ef'] 
0

Spalato sulla scheda, ma poi rimuovere tutte le partite vuote.

text = "hi\tthere\t\t\tmy main man" 
print [splits for splits in text.split("\t") if splits is not ""] 

Uscite:

['hi', 'there', 'my main man'] 
0

Python ha il supporto per i file CSV nel modulo omonimo csv. È relativamente anonimo dato che supporta molto di più che solo valori separati da virgola.

Se è necessario andare oltre la divisione delle parole di base, è necessario dare un'occhiata. Diciamo, per esempio, perché hai bisogno di trattare con valori indicati ...

+1

Sì, ma ciò porterebbe comunque a elementi vuoti. –

1

Un'altra regex soluzione basata su:

>>> strs = "foo\tbar\t\tspam" 

>>> r = re.compile(r'([^\t]*)\t*') 
>>> r.findall(strs)[:-1] 
['foo', 'bar', 'spam'] 
Problemi correlati