Разбор пользовательского словаря в Python с использованием класса - PullRequest
0 голосов
/ 23 октября 2019
  1. Данные JSON Я пытаюсь проанализировать данные во фрейм данных или файл CSV.
{
    "reports": [
        {
            "columnHeader": {
                "dimensions": [
                    "ga:date",
                    "ga:dcmLastEventSitePlacement"
                ],
                "metricHeader": {
                    "metricHeaderEntries": [
                        {
                            "name": "ga:sessions",
                            "type": "INTEGER"
                        },
                        {
                            "name": "ga:dcmCost",
                            "type": "CURRENCY"
                        }
                    ]
                }
            },
            "data": {
                "maximums": [
                    {
                        "values": [
                            "2523",
                            "396.7911"
                        ]
                    }
                ],
                "minimums": [
                    {
                        "values": [
                            "0",
                            "0.0"
                        ]
                    }
                ],
                "rowCount": 503,
                "rows": [
                    {
                        "dimensions": [
                            "20191023",
                            "brand"
                        ],
                        "metrics": [
                            {
                                "values": [
                                    "4",
                                    "0.0"
                                ]
                            }
                        ]
                    },
                    {
                        "dimensions": [
                            "20191023",
                            "brand"
                        ],
                        "metrics": [
                            {
                                "values": [
                                    "13",
                                    "0.0"
                                ]
                            }
                        ]
                    }
                       ],
                "totals": [
                    {
                        "values": [
                            "4923",
                            "7914.29571"
                        ]
                    }
                ]
           }
        }
    ]
}
Код, который я пробовал
class GAReportParser:
    def __init__(self, request_response):
        self.request_response = request_response
        # column_indices = {}

    def get_csv(self):
        csv_rows = [self.get_header_csv()]
        rows = self.request_response['data']['rows']
        for row in rows:
            # pprint(row['dimensions'])
            row_csv = ','.join(row['dimensions'])
            metrics = row['metrics']
            for metric in metrics:
                row_csv += ',' + ','.join(metric['values'])
            csv_rows.append(row_csv)

        return "\n".join(csv_rows)

    def get_header_csv(self):
        headers = self.request_response['columnHeader']['dimensions']
        metricHeaders = self.request_response['columnHeader'][
            'metricHeader']['metricHeaderEntries']
        for metricHeader in metricHeaders:
            headers.append(metricHeader['name'])

        headers_csv = ','.join(headers)
        return headers_csv
Ошибка Я получаю

KeyError: 'columnHeader'

Может кто-нибудь, пожалуйста, помогите мне с ошибкой или более простым способом разобрать этот файл в CSV или DF? Я ожидаю, что результат будет

ga: date |ga: dcmLastEventSitePlacement |га: сессии |ga: dcmCost
2019-09-04 |бренд |4 | 0

- редактировать-- 4. ПРАВИЛЬНОЕ решение с помощью @Sadrach Pierre

class GAReportParser:

    def __init__(self, request_response):
        self.request_response = request_response

    def get_csv(self):
        print("get_csv is called")
        csv_rows = [self.get_header_csv()]

        metricHeaders = self.request_response['reports']
        for metricHeader in metricHeaders:
            for row in metricHeader['data']['rows']:
                row_csv = ','.join(row['dimensions'])
                metrics = row['metrics']
                for metric in metrics:
                    row_csv += ',' + ','.join(metric['values'])
                csv_rows.append(row_csv)

       return "\n".join(csv_rows)


    def get_header_csv(self):
        headers = []
        Headers = self.request_response['reports']
        for Header in Headers:
            for items in Header['columnHeader']['dimensions']:
                headers.append(items)
            for name in Header['columnHeader']['metricHeader']['metricHeaderEntries']:
                headers.append(name['name'])

        headers_csv = ','.join(headers)
        return headers_csv

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Примерно так должно работать:

def get_header_csv(self):
    headers = []
    metricHeaders = self.request_response['reports']
    for metricHeader in metricHeaders:
        for name in metricHeader['columnHeader']['metricHeader']['metricHeaderEntries']:
            headers.append(name['name'])

    headers_csv = ','.join(headers)
    return headers_csv
0 голосов
/ 23 октября 2019

Если список содержит действительные строки JSON, то вы можете использовать json.loads()

т.е.

import json
json_list = ['{"a": 1}', '{"a": 2}']

dict_list = [json.loads(d) for d in json_list]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...