2016-11-12 7 views
0

Ich lerne Python, und arbeitet derzeit an das Lesen in einer Datei, die Zeilen aufteilen und dann bestimmte Elemente drucken. Ich habe jedoch Probleme, mich mehrere Male zu teilen. Die Datei an dem ich arbeite hat viele Linien, die diese aussehenSplit in Python und Streifen Whitespace

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 

Ich versuche, es zu spalten, die zuerst von Reiter und Newline „/ t/n“, und teilen dann die Elemente mit |, ich habe versucht, .split und .strip und habe nicht viel Glück. Ich dachte, vielleicht, wenn ich nur auf einer einzigen Zeile habe ich nach unten auf die Idee kommen könnte, und es dann in einer Schleife ändern, die die Datei

blast_out = ("c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754") 
fields = blast_out.strip(' \t\r\n').split() 
subFields = fields.split("|") 
print(fields) 
print(subFields) 

print (Felder)

['c0_g1_i1|m.1', 'gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 

Druck zugreifen würde (Subfelder) erzeugt einen Fehler

subFields = fields.split('|') 
AttributeError: 'list' object has no attribute 'split' 

Dies ist, was ich tat, nur um zu versuchen, die Leerzeichen abzustreifen und die Reiter, dann auf aufzuspalten | aber es scheint nichts zu tun. Schließlich meine gewünschte Ausgabe von dieser einzigen Zeichenfolge wäre

c0_g1_i1 m.1 Q9HGP0.1 100.0 
+0

Die '.strip()' ist redundant, die '.split()' Streifen für Sie. –

Antwort

2

Sie haben jetzt eine Liste von separaten Strings. Es sieht so aus, als ob das Eingabeformat verschachtelte Listen kodiert; das äußere Format durch Leerzeichen begrenzt, die innere durch | Zeichen.

Sie können den äußeren Strang gespalten, spaltete dann jedes resultierendes Element wieder in einer Liste Verständnis:

[item.split('|') for item in blast_out.split()] 

Beachten Sie, dass die str.strip() völlig überflüssig ist, der str.split() Anruf (ohne Argument oder None als erstes Argument) entfernt bereits führende und nachfolgende Leerzeichen.

Wenn Sie eine flache Liste erwartet Sie eine weitere Schleife zum Verständnis hinzufügen würde:

[value for item in blast_out.split() for value in item.split('|')] 

Erstere besser wäre, wenn die Anzahl der Elemente in den inneren Listen variabel ist; Es ist einfacher, das erste oder letzte Element einer verschachtelten Liste zu finden, als in einer flachen Liste herauszufinden, wo jeder durch Leerzeichen begrenzte Abschnitt beginnt oder endet.

Ihre Endwerte für Ihren gegebenen Beispiel kann dann mit einer der beiden folgenden Ausdrücke extrahiert werden, je nachdem, welche Variante Sie ausgesucht:

(result[0][0], result[0][1], result[1][3], result[2][0]) 

oder

(result[0], result[1], result[5], result[7]) 

Demo:

>>> blast_out = "c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754" 
>>> [item.split('|') for item in blast_out.split()] 
[['c0_g1_i1', 'm.1'], ['gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO'], ['100.00'], ['372'], ['0'], ['0'], ['1'], ['372'], ['1'], ['372'], ['0.0'], ['754']] 
>>> (_[0][0], _[0][1], _[1][3], _[2][0]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
>>> [value for item in blast_out.split() for value in item.split('|')] 
['c0_g1_i1', 'm.1', 'gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 
>>> (_[0], _[1], _[5], _[7]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
+0

Vielen Dank! Sie machen einen tollen Job und erklären es hier :) Diese Lösung funktioniert in einer einzigen Zeile, aber wenn ich versuche, eine Eingabedatei durchzulaufen, habe ich immer noch Probleme mit der Anwendung der Schleife auf jede Zeile statt nur auf die erste Zeile. 'blast_output = open (" blast.txt "). read() für die Zeile in blast_output: fields = blast_output.split() subFields = [item.split ('|') für den Artikel in blast_output.split()] print (str (subFields)) 'Es druckt immer nur die selbe Zeile –

+0

@JamieLeigh: Du hast die Zielvariable' line' benannt, aber dann 'blast_output' geteilt. Sie müssen die 'fields = blast_output.split()' Zeile überhaupt nicht behalten, Sie benutzen sie nicht. 'subFields = item.split ('|') für das Element in line.split()] sollte ausreichen. –

+0

Oh, danke! Das Problem, das ich jetzt habe, ist, dass es das gesamte Dokument in eine einzige Zeile konvertiert und es einmal für jede Zeile druckt, aber ich möchte jede Zeile einzeln durchlaufen, ich weiß nicht, ob das Sinn ergibt. Aber stimmt etwas nicht mit meiner 'for line in blast_output:' Schleife, die ich ändern könnte, so dass es jede Zeile teilt, und lasst mich Informationen von jeder Zeile einzeln ausdrucken? –

Verwandte Themen