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

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

Я попытался явно определить ключи, но у меня возникла та же проблема.Я уверен, что я делаю очень простую ошибку.

import json
import requests
import csv

def get_data():
    group_id = 9039
    api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    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
    driver_keys = ["id","groupId","vehicleId","currentVehicleId","username"]
    for d in drivers:
        for key in d.keys():
            if key not in driver_keys:
                driver_keys.append(key)
    csvwriter.writerow(driver_keys)

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

    csvFile.close()

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

Вот частичный вывод, показывающий проблему.Обратите внимание, что если не указан параметр vehicleId или currentVehicleID, мне нужно значение NULL или ''.

id,groupId,vehicleId,currentVehicleId,username
321680,9039,,212014918234501,awinchell
91907,9039,,abrauer
134763,9039,212014918234742,abarbosa
134767,9039,212014918234707,212014918234707,ctoepfer

Это то, что я ищу.

id,groupId,vehicleId,currentVehicleId,username
321680,9039,,212014918234501,awinchell
91907,9039,,,abrauer
134763,9039,,212014918234742,abarbosa
134767,9039,212014918234707,212014918234707,ctoepfer
...