Bewahren Leerzeichen bei Verwendung von split() und join() in python
Ich habe eine Daten-Datei mit den Spalten wie
BBP1 0.000000 -0.150000 2.033000 0.00 -0.150 1.77
und die einzelnen Spalten werden getrennt durch eine unterschiedliche Anzahl von Leerzeichen.
Mein Ziel ist es zu Lesen in den Zeilen, einige der Mathematik auf mehrere Zeilen, zum Beispiel Multiplikation Spalte 4 von .95, und schreibt diesen in eine neue Datei. Die neue Datei sollte so Aussehen wie das original, außer für die Werte, die ich geändert.
Mein Ansatz wäre das Lesen in den Zeilen, die als Elemente einer Liste. Und dann würde ich split()
für diese Zeilen, ich bin interessiert an, was mir eine Unterliste mit den einzelnen Spaltenwerte. Dann mache ich die änderung, join()
die Spalten zusammen und schreiben Sie die Zeilen der Liste, um eine neue text-Datei.
Das problem ist, dass ich die unterschiedliche Anzahl von Leerzeichen. Ich weiß nicht, wie vorstellen Sie wieder in der gleichen Weise, die ich Lesen. Die einzige Möglichkeit die ich mir vorstellen könnte ist die Anzahl Zeichen in der Zeile, bevor ich aufteilen, das wäre sehr mühsam. Hat jemand eine bessere Idee, um dieses problem anzugehen?
- wenn sich die Datei in einem festen format, dann mit der gleichen Anzahl von Leerzeichen können Sie die Spaltenbreite ändern. Sie könnten die Verwendung von string-Formatierung, um das Dateiformat beibehalten z.B.
"{:4s} {:10.6f} {:10.6f} {:11.6f} {:5.2f} {:6.3f} {:6.2f}".format(*row)
, worow = ["BBP1", 0.0, -0.15, 0.95*2.033, 0.0, -0.15, 1.77]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie verwenden möchten
re.split()
in diesem Fall, mit einer Gruppe:zurückkehren würde, sowohl die Spalten und der Leerraum, so dass Sie wieder kann die Linie später mit der gleichen Menge von whitespace-Zeichen enthalten.
Beispiel:
Du wahrscheinlich tun möchten, entfernen Sie den Zeilenvorschub am Ende.
(\S+)
''
string für diejenigen.(\S+)
hat immer nicht-Wort-strings, zum start und Ende, die einen vorhersagbaren Kopf aus meiner Perspektive.Anderen Weg, dies zu tun ist:
Wenn wir angeben Leerzeichen argument split-Funktion, erstellt es die Liste ohne Essen aufeinanderfolgenden Leerzeichen. Also, die original-Nummern der space-Zeichen werden wiederhergestellt, nachdem "join" - Funktion.
Für Zeilen Leerraum am Anfang und/oder Ende, ein robuster Muster ist
(\S+)
zu split bei nicht-whitespace-Zeichen:Diese beiden Zeilen haben die gleiche Anzahl von Elementen nach dem splitten, das ist praktisch. Die ersten und letzten Elemente sind immer whitespace-Zeichenketten. Diese Linien können wieder hergestellt werden, verwenden Sie einen join mit einer Zeichenfolge der Länge null:
Gegensatz zu den Beispiel mit einem ähnlichen Muster
(\s+)
(Kleinbuchstaben) verwendet, in der anderen Antwort hier, jede Linie teilt sich mit einem anderen Ergebnis Längen und Positionen der Elemente:Wie Sie sehen können, das wäre ein bisschen schwieriger zu verarbeiten, die in einer konsistenten Art und Weise.