Как прочитать одну полную строку с последующим чтением только последних пяти символов? - PullRequest
2 голосов
/ 07 января 2020

Я новичок в Python. Я хочу прочитать файл JSON из мониторинга. Файл выглядит следующим образом:

Мне нужна только временная метка, системное имя, например "test-1", а также цифры от мощности, диска и процессора.

Мой скрипт выглядит так

#!/usr/bin/env python3.3

import os
import json 

    with open('test.json', 'r') as f:
        distros_dict = json.load(f)

    for distro in distros_dict:
        print(distro['"power [W]"'])

Обновление: как мне записать их в переменные?

Новые образцы данных:

[
   {
      "Area":"CLOUD",
      "timestamp":"2019-11-06T00:00:00",
      "Systeme":{
         "test-4":{
            "power [W]":181.05,
            "disk [%]":52.28
         },
         "test-1":{
            "power [W]":280.56,
            "disk[%]":6.33,
            "cpu[%]":0.1
         },
         "test-2":{
            "power [W]":271.84,
            "disk[%]":6.52,
            "cpu[%]":0.1
         },      
         "test-8":{
            "power [W]":453.56,
            "disk[%]":93.63,
            "cpu[%]":5.04
         }
      }
   }
]

Требуемые выходные переменные: процессор, питание и диск. Вместо их печати в командной строке я хочу написать их в трех переменных

Ответы [ 4 ]

2 голосов
/ 07 января 2020

Установите свой словарь (json формат, проверьте, использует ли он правильный формат на https://jsonlint.com/)

dict = {
  "Area": "CLOUD",
    "timestamp": "2019-11-06T12:24:25",
    "Systeme": {
        "test-1": {
            "power [W]": 181.05,
            "disk [%]": 52.28
        },
        "test-2": {
            "power [W]": 199.67,
            "disk [%]": 54.47
        },
        "test-3": {
            "power [W]": 175.68,
            "disk [%]": 10.17,
             "cpu [%]": 22.43
}}}

Загрузите ваш словарь как json

import json
x = json.loads(json.dumps(dict))

L oop через ваш dict [Systeme] и захватите все свойства, которые вам нужно напечатать. Я выбрал dict.get("systeme") вместо dict["Systeme"], потому что вам не хватает процессора в test-3

for line in x["Systeme"]:
    power = x.get("Systeme").get(line).get("power [W]", "")
    disk = x.get("Systeme").get(line).get("disk [%]", "")
    cpu = x.get("Systeme").get(line).get("cpu [%]", "")
    print(f"{line} {power} {disk} {cpu}")
    power, disk, cpu = "", "", ""

Примечание: приведенный выше пример - Python 3.7+, требуется оператор print подлежит изменению для более ранних версий Python:
print("%s %s %s %s"%(line, power, disk, cpu) )

2 голосов
/ 07 января 2020

Ваш json файл с мультидиктом должен иметь следующий формат:

[    
    { 
        "Area": "CLOUD",
        "timestamp": "2019-11-06T12:24:25",
        "Systeme": {
            "test-1": {
                "power [W]": 181.05,
                "disk [%]": 52.28
            },
            "test-2": {
                "power [W]": 199.67,
                "disk [%]": 54.47
            },
            "test-3": {
                "power [W]": 175.68,
                "disk [%]": 10.17,
                "cpu [%]": 22.43
            }
        }
    },
    { 
        "Area": "CLOUD",
        "timestamp": "2019-11-06T12:24:25",
        "Systeme": {
            "test-1": {
                "power [W]": 181.05,
                "disk [%]": 52.28
            },
            "test-2": {
                "power [W]": 199.67,
                "disk [%]": 54.47
            },
            "test-3": {
                "power [W]": 175.68,
                "disk [%]": 10.17,
                "cpu [%]": 22.43
            }
        }
    }
]

Вам просто нужно объединить значения из каждого словаря в строку для результата:

with open('test.json', 'r') as f:
    distros_dict = json.load(f)

test_keys = ['power [W]', 'disk [%]', 'cpu [%]']

for distro in distros_dict:
    for key, value in distro['Systeme'].items():
        output_list =[]
        output_list.append(key)
        for single_system_key, single_system_value in distro['Systeme'][key].items():
           if single_system_key in test_keys:
              output_list.append(single_system_value)
        print(' - '.join(str(e) for e in output_list))

Окончательный результат вы получите:

test-1 - 181.05 - 52.28
test-2 - 199.67 - 54.47
test-3 - 175.68 - 10.17 - 22.43
test-1 - 181.05 - 52.28
test-2 - 199.67 - 54.47
test-3 - 175.68 - 10.17 - 22.43
1 голос
/ 17 февраля 2020

Вы можете использовать список кортежей для хранения ваших переменных. Вот пример того, как вы можете сделать это.

import json
import sys

data = None

with open('test.json', 'r') as file:
    data = json.load(file)

# since we are dealing with input from another source, we should validate it every step of the way
# check if there was no data in the file
if not data:
    sys.exit(0)



variables = []  # this list would contain tuples. The tuple would contain system name, cpu, power, and disk. Any missing data would be set as None
for distro in data:
    if 'Systeme' not in distro:  # we verify this attribute exists
        continue
    for system_name, system in distro['Systeme'].items():
         variables.append( 
             (system_name, system.get('cpu[%]'), system.get('power [W]'), system.get('disk[%]'))
         )

# now that we have them stored inside the 'variables' list, we can print them to verify that they are stored.
for system_name, cpu, power, disk in variables:
    print(system_name, cpu, power, disk)
    # do other stuff with these variables here if you want.
0 голосов
/ 17 февраля 2020

вы можете попробовать этот подход. вам нужно установить pandas для него

pip install pandas

import json
import pandas as pd
data = json.load(open('data.json'))  // asuming your data is in data.json


new_json=[]
for rec in data:
    new_doc = {}
    for key in rec:
        if type(rec[key]) is str:
            new_doc[key] = rec[key]
        else:
            for key1 in rec[key]:
                if type(rec[key][key1]) is str:
                    new_doc[key+'_'+key1] = rec[key][key1]
                else:
                    for key2 in rec[key][key1]:
                        if type(rec[key][key1][key2]) in [str,float,int]:
                            new_doc[key+'_'+key1+'_'+key2] = rec[key][key1][key2]
                        else:
                            print("don't support more nested json")
    new_json.append(new_doc)

data = pd.DataFrame(new_json)
data.head()  //peak into your new data structure][1]][1]

теперь у вас будет хорошо отформатированная структура таблицы и вы сможете выполнить любой запрос в теме. поэтому, чтобы получить всю мощность типа 1 и временную метку, просто выполните

data[['Systeme_test-1_power [W]','timestamp']]

Мы можем очень легко выполнить множество других типов запросов и графиков. Читайте документы от panda для получения дополнительной информации или комментариев, если у вас есть сомнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...