Formatierung Ausgabe

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
Jootto
User
Beiträge: 5
Registriert: Samstag 26. Mai 2018, 15:10

Hallo zusammen

leider noch ganz am Anfang mit Python hänge ich ein ein wenig in der Luft. Deshalb bin ich mir auch nicht sicher nach was ich im Forum suchen soll!

Ich lese ein JSON File aus. Als Ausgabe erhalte ich -- Auszug --

Code: Alles auswählen

{u'conf_instance_id': u'i-02bf3e0d8310045ff', u'action_ids': [{u'alert_type': -1, u'action_id': u'36397000015702831'}], u'display_name': u'ascent-prototype.hannover-re.cloud (AWS)', u'is_upgrade_available': True, u'notification_profile_id': u'36397000014036143', u'one_min_supported': True, u'monitor_id': u'36397000016333145', u'threshold_profile_id': u'36397000009798032', u'templateid': u'-', u'server_type': u'WINDOWS', u'monitor_groups': [u'36397000018614237'], u'state': 0, u'sm_poll_interval': 5, u'type': u'SERVER', u'user_group_ids': [u'36397000015100413'], u'log_needed': True, u'resource_not_supported': False, u'ipaddress': u'10.151.148.135', u'hostname': u'app1'}
Diese Ausgabe möchte ich nun filtern und erhalte das.

Code: Alles auswählen

36397000021074195, SERVER, apex.hannover-re.cloud, True, 36397000014036143, [u'36397000003139007', u'36397000010098005']
das filtern mache ich hiermit:

Code: Alles auswählen

monitorids = monitor_list()

filtered_result = []
for monitor_entry in monitorids:
    filtered_result.append("{monitor_id}, {type}, {display_name}, {log_needed}, {notification_profile_id}, {user_group_ids}".format(**monitor_entry))
result = filtered_result
print (result)
wenn ich nicht alles täuscht, fehlen hier die " ' " (einfache Anführungsstriche).
Wahrscheinlich wieder einmal ganz simple, aber wie das so ist -- schön wäre ein "Anstupser"

Danke Jörg
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo fehlt denn ein Anführungszeichen? Verstehe ich nicht? Es wäre besser, das Ergebnis in filtered_result als Wörterbücher zu behalten.
Jootto
User
Beiträge: 5
Registriert: Samstag 26. Mai 2018, 15:10

Hallo Sirius3

Danke für die schnelle Antwort.
Ich möchte folgendes erreichen. Das Ergebnis SERVER,test.cloud, True, 36397123456, [u'36397123456', u'36397000123456'] soll anschließend weiter verarbeite werden.

Wenn ich die Ausgabe aber nun zBsp mit "print (filtered_result[0])" anzeige, erhalte ich das gesamte Objekt.
Ich brauche aber nur das "Stück" zwischen dem Komma zBsp. "SERVER" oder "test.cloud"
Mit split komme ich leider auch nicht weiter, da es sich um ein "list" Object handelt!

Am Ende soll alles an ein CURL Command übergeben werden. (Auszug)

Code: Alles auswählen

.... 
-d '{
      "type": "Objekt1",
       "display_name": "Objekt2",
       "log_needed": Objekt3,
       "notification_profile_id": "Objekt4",
       "user_group_ids": [
         "Objekt5",
         "Objekt5"
         ],
         .....
    }'
Schöne Grüße Jörg
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst dir die Daten eben aus der Datenstruktur rausholen. Statt sie zu einem String zu machen, in dem du dann irgendwie wieder rumfuhrwerkst.

Code: Alles auswählen

data = {'action_ids': [{'action_id': '36397000015702831', 'alert_type': -1}],
 'conf_instance_id': 'i-02bf3e0d8310045ff',
 'display_name': 'ascent-prototype.hannover-re.cloud (AWS)',
 'hostname': 'app1',
 'ipaddress': '10.151.148.135',
 'is_upgrade_available': True,
 'log_needed': True,
 'monitor_groups': ['36397000018614237'],
 'monitor_id': '36397000016333145',
 'notification_profile_id': '36397000014036143',
 'one_min_supported': True,
 'resource_not_supported': False,
 'server_type': 'WINDOWS',
 'sm_poll_interval': 5,
 'state': 0,
 'templateid': '-',
 'threshold_profile_id': '36397000009798032',
 'type': 'SERVER',
 'user_group_ids': ['36397000015100413']}

curl_arguments = {
   ...
   'display_name': data['display_name'],
.. }
Jootto
User
Beiträge: 5
Registriert: Samstag 26. Mai 2018, 15:10

Hallo ___deets__

Danke für die Antwort. So wie in deinem Bespiel beschrieben funktioniert es.
Leider erhalte ich aber bei meinem Script den Fehler "TypeError: list indices must be integers, not str". Hast du noch eine Idee den Type anzupassen. Sorry für die wahrscheinlich banale Frage.

Code: Alles auswählen

with open('MONITOR_LIST', 'r') as fp:  
    inText = fp.read()
    data = json.loads(inText)

filtered_result = []
for entry in data["data"]:
        if entry["type"] == 'SERVER':
                filtered_result.append(entry)
                
curl_arguments = {
        'display_name': filtered_result['display_name']
        }
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du dir mal ueberlegt, was die Fehlermeldung bedeuten koennte? Was heisst das denn auf deutsch? Und was ist denn filtered_result fuer ein Datentyp?
Jootto
User
Beiträge: 5
Registriert: Samstag 26. Mai 2018, 15:10

Die Antwort kam wie erwartet promt. Nur wie kann ich verhindern , das aus einem Dict eine Liste entsteht? Ich brauche den Filter nach "Server" da es noch weitere Type im JSON File gibt.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jootto: Es entsteht ja nicht auf magische Weise eine Liste – *Du* erstellst die Liste und hängst da Einträge an. Wenn Du das anders machen möchtest, dann mach das halt anders. Allerdings ist die Frage wie, denn wenn es mehrere Einträge gibt, dann gibt es ja nicht den *einen* 'display_name', sondern jeder Eintrag hat den ja. Welcher soll denn da genommen werden? Oder möchtest Du vielleicht für jeden der Einträge etwas bestimmtes machen? Dann mach das: Schreib eine Schleife über die gefilterten Einträge in der etwas für jeden einzelnen Eintrag gemacht wird.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten