2016-05-06 7 views
2

Ich bin neu bei Python und habe Probleme mit der Formatierung der Ausgabe, ähnlich wie in csv.Python - Formatierung der Ausgabe mit unterschiedlicher Anzahl von Leerzeichen

Der folgende Code führt ein expect-Skript aus, das Spalten mit einer unterschiedlichen Anzahl von Leerzeichen trennt.

out = subprocess.check_output([get_script, "|", "grep Up"], shell=True 
print out 

1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356 

Was ich will ist, alle Leerzeichen zu entfernen und ein "," Trennzeichen hinzuzufügen.

1501,4122:1501,Mesh,1.2.3.4,Up,262075,261927 1502,4121:1502,Mesh,1.2.3.5,Up,262089,261552 1502,4122:1502,Spok,1.2.3.6,Up,262074,261784 701000703,4121:701000703,Mesh,1.2.3.7,Up,262081,261356

Ich kann dies mit awk -v OFS=',' '{$1=$1};1' über awk erreichen, aber ich kämpfen, um eine Python-Äquivalent zu finden.

Jede Anleitung wird sehr geschätzt!

Antwort

0

Verwendung Dies sollte unter Verwendung der sub Funktion in der re (regex) Bibliothek möglich.

import re 

table_str = """ 
1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356 
""" 

re.sub(" +", ",", table_str) 

Die " +" Stringliteral in der sub Funktion macht eine gierige Spiel auf alle Leerzeichen.

+1

Verwenden Sie 'str' nicht als Variablennamen. – styvane

+0

Was passiert, wenn einige Felder eingebettete Leerzeichen enthalten? – PaulMcG

+0

Danke Ich mag diesen Ansatz mit Regex. Klappt wunderbar! In diesem speziellen Fall gibt es keine eingebetteten Bereiche, um die Sie sich kümmern müssen. – joefernandez3

2

Split jede Zeile auf Raum und kommen dann das Ergebnis mit einem Komma

# The commented out step is needed if out is not a list of lines already 
# out=out.strip().split('\n') 

for line in out: 
    print ','.join(line.split()) 
+0

Danke! Das Stück in Kommentaren war was ich vermisste. out war nicht schon eine Liste von Zeilen, so dass die split() s und Joins(), die ich ausprobierte, zu unerwarteten Ergebnissen führten. – joefernandez3

1

Sie out umwandeln können wie folgt:

import csv 
import StringIO 

out = """1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356""" 

csv_input = csv.reader(StringIO.StringIO(out), delimiter=' ', skipinitialspace=True) 

with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerows(csv_input) 

Geben Sie output.csv Datei enthält:

1501,4122:1501,Mesh,1.2.3.4,Up,262075,261927 
1502,4121:1502,Mesh,1.2.3.5,Up,262089,261552 
1502,4122:1502,Spok,1.2.3.6,Up,262074,261784 
701000703,4121:701000703,Mesh,1.2.3.7,Up,262081,261356 

StringIO wird verwendet, um Ihrezu machen Die Zeichenfolgewird als Dateiobjekt für das zu verwendende Modul csv angezeigt.

Python Getestet 2.7.9

Verwandte Themen