Zeile in einzelne Variablen aufteilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo zusammen,

ich habe folgende Zeile:

Code: Alles auswählen

  line = "S    | -f <dir>     | /home/hte4993/tmp/pevtest2    | f1.txt,f2.txt,f3.dat  | 12345"
Die einzelnen Abschnitte möchte ich nun in einzelne Variablen packen. Das mache ich bisher so:

Code: Alles auswählen

type, option, directory, file, number = line.split("|")
Was aber noch stört, sind die Leerzeichen, die jetzt die einzelnen Variablen-Inhalte umgeben. Das könnte man ja per

Code: Alles auswählen

type = type.strip() ...
wegbekommen, aber geht das auch eleganter? Eventuell bereits beim Zerlegen?

Gruß
API
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@api: mit regulären Ausdrücken:

Code: Alles auswählen

line = "S    | -f <dir>     | /home/hte4993/tmp/pevtest2    | f1.txt,f2.txt,f3.dat  | 12345"
type, option, directory, file, number = re.split('\s*\|\s*', line)
Daikoku
User
Beiträge: 66
Registriert: Montag 20. April 2015, 21:14

Eine weitere Möglichkeit wäre, vor dem line.split('|') den string schon zu bereinigen.

Code: Alles auswählen

line = ''.join("S    | -f <dir>     | /home/hte4993/tmp/pevtest2    | f1.txt,f2.txt,f3.dat  | 12345".split())
type, option, directory, file, number = line.split("|")
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@Sirius3: An sich eine gute Möglichkeit - funktioniert auch. Ich habe nur beim Aufschreiben meines Problems einen kleinen Fehler gemacht, der sich allerdings negativ auswirkt.

Der String lautet in Wirklichkeit:

Code: Alles auswählen

line = "   S    | -f <dir>     | /home/hte4993/tmp/pevtest2    | f1.txt,f2.txt,f3.dat  | 12345"
Also vor dem ersten Wert (S) sind auch noch Leerzeichen. Und die werden bei deiner Lösung nun nicht weggeputzt.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@Daikoku: Das funktioniert so leider nicht. Bei deiner Lösung sind alle Leerzeichen weg - auch die innerhalb der Werte. Zum Beispiel aus "-f <dir>" wird dann "-f<dir>". :(
Daikoku
User
Beiträge: 66
Registriert: Montag 20. April 2015, 21:14

@api was mir noch aufgefallen ist. Du überschreibst mit type und file Python builtin Funktionen, also eingebaute Funktionen.
Wenn das gewollt ist fein, wenn nicht, solltest Du Dir andere Namen überlegen.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@Daikoku: :shock: Da hast du natürlich Recht !! Das werde ich ändern... Danke für den Hinweis, habe ich überhaupt nicht dran gedacht...
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@api: Leerzeichen am Anfang und Ende kann man mit strip beseitigen.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@Sirius3: Ich habe jetzt erstmal eine Kombination gewählt - die auch schon recht gut ist und auf jeden Fall funktioniert:

Code: Alles auswählen

type, option, directory, file, remus, reason, release_person = re.split('\s*\|\s*', line.strip())
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@Sirius3: Sehr gut. Die Lösung gefällt mir. Danke. :D
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

map(str.strip, line.split('|'))
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@snafu: Auch nicht schlecht. Darauf wäre ich nun gar nicht gekommen, obwohl es doch so naheliegend ist. :D

Danke auch.
Antworten