String nach Tupel konvertieren

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
michaelbierenfeld
User
Beiträge: 10
Registriert: Mittwoch 19. Juli 2006, 09:36

Freitag 28. Juli 2006, 14:03

Hallo

ab und zu darf ich auch mal wieder programmieren. Also wie kann ich denn den String aus einem snmp request
.1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4 = STRING: JOBS.UNIX.C2.INFODB
in den Tupel

(oid, typ, value)

zerlegen. Wobei in diesm Beispiel
oid = 1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4
type = STRING:
value = JOBS.UNIX.C2.INFODB

ist.

Beste Gruesse

Michael
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Freitag 28. Juli 2006, 14:16

mit split(' ') trennst du nach Leerzeichen, dann hast du zwar noch das Leerzeichen im Tupel aber der Rest passt schonmal. Das Leerzeichen kann man dann auch entfernen, und fertig (das entfernen geht doch bestimmt auch kürzer?).

>>> x = '1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4 = STRING: JOBS.UNIX.C2.INFODB'
>>> y = x.split(' ')
>>> z = y[0],y[2],y[3]
>>> z
('1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4', 'STRING:', 'JOBS.UNIX.C2.INFODB')
michaelbierenfeld
User
Beiträge: 10
Registriert: Mittwoch 19. Juli 2006, 09:36

Freitag 28. Juli 2006, 14:23

Hi,

ja so was ähnliches geht in die Richtung. Nur mir schwebt so was wie

Code: Alles auswählen

oid, typ, val = # Magische Python Anweisung
vor. Gehen wuerde

Code: Alles auswählen

# split zeugs
(oid, typ, val) = (splitted [0], splitted [1], splitted [3])
Ich hätte es nur gerne eleganter um bei den Java Leuten angeben zu können

Grüße

Michael
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Freitag 28. Juli 2006, 14:39

Code: Alles auswählen

x =".1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4 = STRING: JOBS.UNIX.C2.INFODB"

x = x.replace(' = ', ';').replace(': ', ';').lstrip('.')
oid, typ, value = x.split(';')

print '%s\n%s\n%s' % (oid, typ, value)
Oder

Code: Alles auswählen

x =".1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4 = STRING: JOBS.UNIX.C2.INFODB"

oid, typ, value = x.replace(' = ', ';').replace(': ', ';').lstrip('.').split(';')

print '%s\n%s\n%s' % (oid, typ, value)
Resultat bei beiden

Code: Alles auswählen

1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4
STRING
JOBS.UNIX.C2.INFODB
michaelbierenfeld
User
Beiträge: 10
Registriert: Mittwoch 19. Juli 2006, 09:36

Freitag 28. Juli 2006, 15:01

Super,

dieses

Code: Alles auswählen

wert0, wert1, wert2 = "michael bierenfeld unsinn".split ()
war mir nicht bewußt.

Danke

Michael
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 28. Juli 2006, 21:35

michaelbierenfeld hat geschrieben:

Code: Alles auswählen

split ()
...
splitted [0]
Gewöhne dir mal die Leerzeichen nach Funktions und Variablennamen ab. Das ist unbequem zu lesen. Schließlich bezieht sich das [0] direkt auf splitted.

http://www.python.org/dev/peps/pep-0008/
BlackJack

Freitag 28. Juli 2006, 22:27

michaelbierenfeld hat geschrieben:ja so was ähnliches geht in die Richtung. Nur mir schwebt so was wie

Code: Alles auswählen

oid, typ, val = # Magische Python Anweisung
vor. Gehen wuerde

Code: Alles auswählen

# split zeugs
(oid, typ, val) = (splitted [0], splitted [1], splitted [3])
Ich hätte es nur gerne eleganter um bei den Java Leuten angeben zu können
Wenn Du magische Einzeiler elegant findest, dann solltest Du Dir mal Perl anschauen. In Python ist es eleganter eine Funktion zu schreiben, die robust ist und bei der man verstehen kann was sie tut.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Samstag 29. Juli 2006, 11:17

BlackJack hat geschrieben:
michaelbierenfeld hat geschrieben:

Code: Alles auswählen

oid, typ, val = # Magische Python Anweisung
Wenn Du magische Einzeiler elegant findest[...]
Was is denn daran magisch?

Code: Alles auswählen

x =".1.3.6.1.4.1.2562.1.1.8.1.1.8.3.85.67.52.1871.1201184.4 = STRING: JOBS.UNIX.C2.INFODB"

oid, typ, value = x.replace(' = ', ';').replace(': ', ';').lstrip('.').split(';')

print '%s\n%s\n%s' % (oid, typ, value)
Das is auch nur ne ganz normale Pythonanweisung, nur dass sie halt - nich wirklich übersichtlich - in eine Zeile geschrieben wurde.

Greetz
BlackJack

Samstag 29. Juli 2006, 11:41

CrackPod hat geschrieben:
BlackJack hat geschrieben:
michaelbierenfeld hat geschrieben:

Code: Alles auswählen

oid, typ, val = # Magische Python Anweisung
Wenn Du magische Einzeiler elegant findest[...]
Was is denn daran magisch?
Da steht das an der Stelle des Kommentars eine magische Python-Anweisung stehen soll.
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 31. Juli 2006, 00:29

Öhm anstelle von dieser funktionalität zu schreiben schlage ich vor du verwendest die methoden der snmp library.

Strings zerlegen ... aber doch bitte nicht bei sowas.

z.b. bei pysnmp kriegst du automatisch den wert mit dem richtigen datentyp.
auch wunderbar mit oid:value tupeln.
michaelbierenfeld
User
Beiträge: 10
Registriert: Mittwoch 19. Juli 2006, 09:36

Montag 31. Juli 2006, 09:42

Hallo,

pysnmp habe ich mir angeschaut. In meinem Fall ist das wie mit Kanonen auf Spatzen geschossen. Besten Dank aber

Michael
Antworten