Как извлечь конкретные данные из JSON и положить в CSV с помощью Python - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть JSON, который находится во вложенной форме.Я хотел бы извлечь конкретные данные из json и поместить их в csv, используя pandas python.

data = { 
    "class":"hudson.model.Hudson",
    "jobs":[ 
        { 
            "_class":"hudson.model.FreeStyleProject",
            "name":"git_checkout",
            "url":"http://localhost:8080/job/git_checkout/",
            "builds":[ 
                { 
                    "_class":"hudson.model.FreeStyleBuild",
                    "duration":1201,
                    "number":6,
                    "result":"FAILURE",
                    "url":"http://localhost:8080/job/git_checkout/6/"
                }
            ]
        },
        { 
            "_class":"hudson.model.FreeStyleProject",
            "name":"output",
            "url":"http://localhost:8080/job/output/",
            "builds":[ 

            ]
        },
        { 
            "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
            "name":"pipeline_test",
            "url":"http://localhost:8080/job/pipeline_test/",
            "builds":[ 
                { 
                    "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
                    "duration":9274,
                    "number":85,
                    "result":"SUCCESS",
                    "url":"http://localhost:8080/job/pipeline_test/85/"
                },
                { 
                    "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
                    "duration":4251,
                    "number":84,
                    "result":"SUCCESS",
                    "url":"http://localhost:8080/job/pipeline_test/84/"
                }
            ]
        }
    ]
}

Из приведенного выше JSON я хочу получить значение имени задания и построить значение результата.Я новичок в Python, любая помощь будет оценена.До сих пор я пробовал

main_data = data['jobs]
json_normalize(main_data,['builds'],
                    record_prefix='jobs_', errors='ignore')

, который дает информацию только значения ключа сборки, а не название задания.Кто-нибудь может помочь?

Ожидаемый результат :

image for expected output

Ответы [ 3 ]

0 голосов
/ 21 сентября 2019

Просто с номером сборки,

for job in data.get('jobs'):
    for build in job.get('builds'):
        print(job.get('name'), build.get('number'), build.get('result'))

дает результат

git_checkout 6 FAILURE
pipeline_test 85 SUCCESS
pipeline_test 84 SUCCESS

Если вы хотите получить результат последней сборки и достаточно уверены в номере сборкивсегда в порядке убывания

for job in data.get('jobs'):
    if job.get('builds'):
        print(job.get('name'), job.get('builds')[0].get('result'))

и, если вы не уверены в порядке,

for job in data.get('jobs'):
    if job.get('builds'):
        print(job.get('name'), sorted(job.get('builds'), key=lambda k: k.get('number'))[-1].get('result'))

, тогда результат будет:

git_checkout FAILURE
pipeline_test SUCCESS
0 голосов
/ 21 сентября 2019

Предполагая, что последняя сборка является последним элементом в списке, и вам не нужны задания без сборок, это делает:

import pandas as pd

#data = ... #same format as in the question

z = [(job["name"], job["builds"][-1]["result"]) for job in data["jobs"] if len(job["builds"])]

df = pd.DataFrame(data=z, columns=["name", "result"])

#df.to_csv #TODO

Также нам не обязательно нужны панды для создания файла csv.

Вы можете сделать:

import csv

#z = ... #see previous code block

with open("f.csv", 'w') as fp:
    csv.writer(fp).writerows([("name", "result")] + z)

0 голосов
/ 21 сентября 2019

Учитывая только первое значение результата сборки, которое вам может понадобиться в столбце csv, вы можете добиться этого с помощью pandas.

data = {
    "class": "hudson.model.Hudson",
    "jobs": [
        {
            "_class": "hudson.model.FreeStyleProject",
            "name": "git_checkout",
            "url": "http://localhost:8080/job/git_checkout/",
            "builds": [
                {
                    "_class": "hudson.model.FreeStyleBuild",
                    "duration": 1201,
                    "number": 6,
                    "result": "FAILURE",
                    "url": "http://localhost:8080/job/git_checkout/6/"
                }
            ]
        },
        {
            "_class": "hudson.model.FreeStyleProject",
            "name": "output",
            "url": "http://localhost:8080/job/output/",
            "builds": []
        },
        {
            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
            "name": "pipeline_test",
            "url": "http://localhost:8080/job/pipeline_test/",
            "builds": [
                {
                    "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
                    "duration": 9274,
                    "number": 85,
                    "result": "SUCCESS",
                    "url": "http://localhost:8080/job/pipeline_test/85/"
                },
                {
                    "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
                    "duration": 4251,
                    "number": 84,
                    "result": "SUCCESS",
                    "url": "http://localhost:8080/job/pipeline_test/84/"
                }
            ]
        }
    ]
}

main_data = data.get('jobs')
res = {'name':[], 'result':[]}
for name_dict in main_data:
    res['name'].append(name_dict.get('name','NA'))
    resultval = name_dict['builds'][0].get('result') if len(name_dict['builds'])>0 else 'NA'
    res['result'].append(resultval)
print(res)
import pandas as pd
df = pd.DataFrame(res)
df.to_csv("/home/file_timer/jobs.csv", index=False)

Проверьте вывод файла csv

name,result
git_checkout,FAILURE
output,NA
pipeline_test,SUCCESS

Если 'NA'результат хотите пропустить, тогда

main_data = data.get('jobs')
res = {'name':[], 'result':[]}
for name_dict in main_data:
    if len(name_dict['builds'])==0:
        continue
    res['name'].append(name_dict.get('name', 'NA'))
    resultval = name_dict['builds'][0].get('result')
    res['result'].append(resultval)
print(res)
import pandas as pd
df = pd.DataFrame(res)
df.to_csv("/home/akash.pagar/shell_learning/file_timer/jobs.csv", index=False)

Вывод будет bw, как

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