Как я могу экспортировать в CSV, когда некоторые записи JSON содержат разные ключи - PullRequest
0 голосов
/ 26 апреля 2019

Я использую API для получения результатов в формате JSON, а затем конвертирую в CSV. Однако в результатах я вижу, что в некоторых записях отсутствуют ключи. В результате значения CSV смещены в неправильные столбцы

Я запустил свой скрипт, а также запустил API в Postman, и вывод JSON такой же. Я использовал https://json -csv.com / для преобразования JSON в CSV и сравнил его с моим выводом. Вывод https://json -csv.com / показывает, что данные находятся в правильных столбцах, что наводит меня на мысль, что на заднем плане есть некоторый код, который обнаруживает отсутствующий ключ / значение и заполняет его нулевое значение.

import json
import requests
import csv

def get_data():
    group_id = 9039
    api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
    api_url = 'https://api.samsara.com/v1'
    endpoint_url = api_url + '/fleet/drivers'

    my_params = {"access_token": api_token}
    my_data = {"groupId": group_id}
    resp = requests.post(url = endpoint_url, params = my_params, json = my_data)
    array = resp.json()
    text = json.dumps(array)

    return text


def write_file(filename, text):
    dataset = json.loads(text)
    drivers = dataset['drivers']

    csvFile = open(filename,'w')
    csvwriter = csv.writer(csvFile)

    # write header
    if len(drivers) > 0:
        keys = drivers[0].keys()
        csvwriter.writerow(keys)

    # write data
    for line in drivers:
       csvwriter.writerow(line.values())

    csvFile.close()

text = get_data()
write_file('drivers.csv', text)

Из вывода JSON приведен частичный результат.

{
    "drivers": [
        {
            "id": 158830,
            "groupId": 9039,
            "vehicleId": 212014918234731,
            "currentVehicleId": 212014918431705,
            "username": "rdoherty",
        },
        {
            "id": 134808,
            "groupId": 9039,
            "vehicleId": null,
            "username": "sbermingham",
        }

    ]
}

Обратите внимание, что вторая запись не имеет ключа "currentVehicleId": значение. В результате при преобразовании в CSV, если отсутствует значение, все остальные значения перемещаются в столбец слева от того места, где он должен быть.

id  groupId vehicleId   currentVehicleId    username
158830  9039    2.12015E+14 2.12015E+14 rdoherty
134808  9039    null    sbermingham 

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

1 Ответ

1 голос
/ 26 апреля 2019

Я бы порекомендовал изменить словарь и вставить drivers[key] = None или drivers[key] = '' для любых отсутствующих ключей.

Шаг 1: получить все возможные ключи

Если вы уже знаете все возможные ключи, это довольно просто. Просто сохраните все ключи в списке.
Если нет, вам придется пройтись по каждому драйверу и найти все уникальные ключи.

# write header
driver_keys = []
for d in drivers:
    for key in d.keys():
        if key not in driver_keys:
            driver_keys.append(key)
csvwriter.writerow(driver_keys)

Шаг 2: Добавляйте пустые значения в каждую строку по мере продвижения. Поскольку мы выполняем итерацию по одному и тому же списку каждый раз (и не изменяем его), мы можем гарантировать один и тот же порядок, поэтому значения должны совпадать с заголовками столбцов.

# write data
for line in drivers:
    for key in driver_keys:
        if key not in line.keys():
            line[key] = None  # or line[key] = '' if you like
    csvwriter.writerow(line.values())

csvFile.close()
...