3
votes

comment convertir json en csv en python

Voici mon entrée de fichier json

userID,Is salary credited before 5th,Avg Salary of last 3 months,Avg Salary of last 6 months,Avg Balance before salary of last 3 months,Avg Balance before salary of last 6 months
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22
679d3bad-155e-4b39-9ff7-7d564f408942,Yes,15453.33,15290.5,113.15,105.22

Code

    with open('/Users/vrindabv/Documents/PycharmProjects/BankStatementEngine/test.json', "r") as f:
        BankData = json.loads(f.read())
    x = json.loads(json.dumps(BankData))
    f = csv.writer(open("/Users/vrindabv/Documents/PycharmProjects/BankStatementEngine/test.csv", "w"))
    f.writerow(["userID", "Is salary credited before 5th", "Avg Salary of last 3 months", "Avg Salary of last 6 months", "Avg Balance before salary of last 3 months", "Avg Balance before salary of last 6 months"])

    for y in x:
        f.writerow([x["userID"], x["Is salary credited before 5th"],
                    x["Avg Salary of last 3 months"],
                    x["Avg Salary of last 6 months"],
                    x["Avg Balance before salary of last 3 months"],
                    x["Avg Balance before salary of last 6 months"]])

Sortie strong >

{"userID": "679d3bad-155e-4b39-9ff7-7d564f408942", "Is salary credited before 5th": "Yes", "Avg Salary of last 3 months": 15453.33, "Avg Salary of last 6 months": 15290.5, "Avg Balance before salary of last 3 months": 113.15, "Avg Balance before salary of last 6 months": 105.22}

Donc, ici, j'ai eu ma réponse mais au lieu de l'imprimer une fois, elle est imprimée 7 fois .. Comment résoudre ce problème.

p>


2 commentaires

Pourquoi fais-tu cela? x = json.loads (json.dumps (BankData)) ? Dans tous les cas, x est un objet dict . Vous itérez dessus, pour y dans x: qui itérera sur ses clés . Mais vous n'utilisez même jamais y , et écrivez simplement la même ligne 7 fois (le nombre de clés).


@Chris: Que me proposez-vous de faire?


4 Réponses :


0
votes

BankData est un dict dont vous n'avez pas besoin pour l'itérer. Vous pouvez accéder directement aux valeurs à l'aide de la clé.

import csv
import json

with open('/Users/vrindabv/Documents/PycharmProjects/BankStatementEngine/test.json') as infile:
    BankData = json.loads(infile.read())

with open("/Users/vrindabv/Documents/PycharmProjects/BankStatementEngine/test.csv", "w") as outfile:
    f = csv.writer(outfile)
    f.writerow(["userID", "Is salary credited before 5th", "Avg Salary of last 3 months", "Avg Salary of last 6 months", "Avg Balance before salary of last 3 months", "Avg Balance before salary of last 6 months"])
    f.writerow([BankData["userID"], BankData["Is salary credited before 5th"],
                BankData["Avg Salary of last 3 months"],
                BankData["Avg Salary of last 6 months"],
                BankData["Avg Balance before salary of last 3 months"],
                BankData["Avg Balance before salary of last 6 months"]])


1 commentaires

La bibliothèque json peut également lire les objets fichier, sans obtenir la représentation sous forme de chaîne au préalable: json.load (infile)



3
votes

Vous pouvez également utiliser des pandas pour gérer le dataframe,

dct = {"userID": "679d3bad-155e-4b39-9ff7-7d564f408942", "Is salary credited before 5th": "Yes", "Avg Salary of last 3 months": 15453.33,
       "Avg Salary of last 6 months": 15290.5, "Avg Balance before salary of last 3 months": 113.15, "Avg Balance before salary of last 6 months": 105.22}

import pandas as pd

df = pd.DataFrame.from_records(dct, index=[0])

df.to_csv('outputfile.csv')


0 commentaires

0
votes

Vous pouvez faire ceci: Lisez votre JSON et écrivez un fichier CSV avec l'importation des modules json et csv

import json, csv
from collections import OrderedDict #To maintain key value pair order
_json=json.loads(open('data.json', 'r').read(), object_pairs_hook=OrderedDict) 
out=open('converted.csv', 'w')
writer = csv.writer(out)               #create a csv.write
writer.writerow(_json[0].keys())      # header row
for row in _json:
    writer.writerow(row.values())


3 commentaires

Votre code générera la sortie au CSV avec la syntaxe dans les valeurs JSON.


Oui @BhaskarDas, il générera JSON pour le csv fourni


writer.writerow (_json [0] .keys ()) # ligne d'en-tête KeyError: 0 obtenant l'erreur ci-dessus



0
votes

La solution de GeekSambhu a fonctionné pour moi avec une modification mineure. Je l'ai un peu modifié car comme Vinsent, j'ai vu une KeyError . Les gens peuvent obtenir le KeyError si la structure JSON a un objet de niveau supérieur contenant le tableau des lignes de données (cela est considéré comme une meilleure pratique JSON). En supposant un objet de premier niveau appelé 'data', vous ne changeriez que deux lignes de code de la solution de GeekSambhu.

writer.writerow (_json ['data'] [0] .keys ()) # ligne d'en-tête
pour la ligne dans _json ['data']:


0 commentaires