2013-06-11 14 views
25

Ich habe Datei, die durch Tab ("\ t") getrennte Werte enthält. Ich versuche, eine Liste zu erstellen und alle Werte der Datei in der Liste zu speichern. Aber ich bekomme ein Problem. Hier ist mein Code.Aufteilen einer Zeichenfolge basierend auf Registerkarte in der Datei

Es funktioniert gut, solange es nur eine Registerkarte zwischen jedem Wert gibt. Wenn es jedoch eine Registerkarte gibt, kopiert sie auch die Tabelle in Werte. In meinem Fall befindet sich die Extra-Registerkarte meist hinter dem letzten Wert in der Datei. Kann mir jemand helfen?

+2

Gibt es andere Leerzeichen in Ihre Werte, die sollten * nicht * aufgespalten werden? Wenn nicht, könnten Sie einfach 'line.split()' verwenden, und es würde sich darum kümmern (sowie leere führende/nachlaufende Elemente zu verwerfen). –

Antwort

45

können Sie regex hier verwenden:

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

Update:

Sie str.rstrip von '\t' Hinter loswerden können und dann regex gelten.

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

Besser als mein Filter Ansatz +1 –

+0

aber wie wird es gehen, wenn wir die Registerkarte am Ende der Datei haben. Es wird immer noch leerer Wert sein. – hjelpmig

+0

@ yasra002 posten Sie bitte ein Beispiel. –

4

Sie können mit regexp dies tun:

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


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

Split auf der Registerkarte, aber dann alle leeren Streichhölzer entfernen.

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

Ausgänge:

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

Python hat die Unterstützung für CSV-Dateien in der gleichnamigen csv Modul. Es ist relativ falsch benannt, da es viel mehr unterstützt, als nur Komma getrennte Werte.

Wenn Sie über die grundlegende Worttrennung hinausgehen müssen, sollten Sie einen Blick darauf werfen. Nehmen wir zum Beispiel, weil Sie in Not sind mit angegebenen Werte behandeln ...

+1

Ja, aber das würde immer noch zu leeren Elementen führen. –

1

Eine andere regex -basierte Lösung:

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

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