0
votes

Convertir un tableau d'objets JSON en CSV - Python

J'ai réussi à convertir un JSON simple en CSV. Je suis confronté à un problème, lorsque le fichier contient un tableau d'objets JSON. J'utilise le module csv et non pandas pour la conversion. Veuillez vous référer au contenu ci-dessous qui est traité avec succès et qui échoue:

Réussite (lorsque le fichier contient une seule liste / tableau d'objets json):

Extra data ; line 1 column 6789 (char 1234)

Échec:

[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]

La fonction json.loads lance une exception comme suit:

[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]

Comment peut traiter de tels fichiers?

MODIFIER: Ce fichier est vidé à l'aide de Kinesis Firehorse et transféré vers S3. J'utilise lambda pour télécharger le fichier, le charger et le transformer. ce n'est donc pas un fichier .json .


0 commentaires

3 Réponses :


1
votes

Parce que votre fichier n'est pas JSON valide. Vous devez lire votre fichier ligne par ligne, puis convertir chaque ligne individuellement en objet.

Ou, vous pouvez convertir votre structure de fichier comme ceci ...

[
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  },
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  },
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  }
]

et ce sera un fichier JSON valide.


0 commentaires

4
votes

Analysez chaque ligne comme ceci:

with open('input.json') as f:
    for line in f:
        obj = json.loads(line)


0 commentaires

0
votes

Comme l'a dit tanaydin, votre entrée défaillante n'est pas json valide. Cela devrait ressembler à ceci:

list_of_dicts_to_jsonify = {}
object_attributes = ['value', 'key_1', 'key_2', 'key_3', 'key_11']
for item in list_of_objects:
    # Convert object to dictionary
    obj_dict = {}
    for k in object_attributes:
        obj_dict[k] = getattr(item, k) or None
    list_of_dicts_to_jsonify.append(obj_dict)

json_output = json.dumps(list_of_dicts_to_jsonify)

Je suppose que vous créez la sortie json en itérant sur une liste d'objets et en appelant json.dumps sur chacun d'eux. Vous devez créer votre liste de dictionnaires, puis appeler json.dumps sur toute la liste à la place.

[
    {
        "value":0.97,
        "key_1":"value1",
        "key_2":"value2",
        "key_3":"value3",
        "key_11":"2019-01-01T00:05:00Z"
    },
    {"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"},
    {"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}
]


0 commentaires