Voici mon code, des trucs vraiment simples ...
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)
Déclarez certains noms de champs, le lecteur utilise CSV pour lire le fichier et les noms de fichiers pour vider le fichier au format JSON. Voici le problème ...
Chaque enregistrement du fichier CSV se trouve sur une ligne différente. Je veux que la sortie JSON soit de la même manière. Le problème est qu'il dépose tout sur une longue et géante ligne.
J'ai essayé d'utiliser quelque chose comme for line in csvfile:
, puis d'exécuter mon code en dessous de celui avec reader = csv.DictReader( line, fieldnames)
lequel boucle à travers chaque ligne, mais il fait le fichier entier sur une ligne, puis boucle à travers le fichier entier sur une autre ligne ... continue jusqu'à ce qu'il manque de lignes .
Des suggestions pour corriger cela?
Edit: Pour clarifier, actuellement j'ai: (chaque enregistrement sur la ligne 1)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
Ce que je recherche: (2 enregistrements sur 2 lignes)
{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}
Pas chaque champ individuel en retrait / sur une ligne distincte, mais chaque enregistrement sur sa propre ligne.
Quelques exemples d'entrée.
"John","Doe","001","Message1"
"George","Washington","002","Message2"
[{..row..},{..row..},...]
pas produire{..row..}{..row..}..
. C'est-à-dire que la sortie semble être un tableau json d'objets json, pas un flux d'objets json non connectés.Réponses:
Le problème avec la sortie souhaitée est qu'il ne s'agit pas d'un document json valide ,; c'est un flux de documents json !
Ce n'est pas grave, si c'est ce dont vous avez besoin, mais cela signifie que pour chaque document que vous voulez dans votre sortie, vous devrez appeler
json.dumps
.Étant donné que la nouvelle ligne que vous souhaitez séparer de vos documents n'est pas contenue dans ces documents, vous êtes obligé de la fournir vous-même. Il nous suffit donc de retirer la boucle de l'appel à json.dump et d'interposer les retours à la ligne pour chaque document écrit.
la source
DictReader
sans donner d'fieldnames
argument; il lira alors la première ligne pour obtenir les noms de champ du fichier.csvfile = open('file.csv', 'r',encoding='utf-8')
etjsonfile = open('file.json', 'w',encoding='utf-8')
Vous pouvez utiliser Pandas DataFrame pour y parvenir, avec l'exemple suivant:
la source
J'ai pris la réponse de @ SingleNegationElimination et l'ai simplifiée en un trois lignes pouvant être utilisé dans un pipeline:
la source
Documentation de json.dumps ()
la source
Vous pouvez essayer ceci
Éditer:
Une approche plus simple
la source
csvmapper
, pour faire cela (et peut-être où l'obtenir), par opposition à quelque chose de intégré.Ajouter le
indent
paramètre àjson.dumps
Notez également que vous pouvez simplement utiliser
json.dump
avec l'openjsonfile
:la source
Je vois que c'est vieux mais j'avais besoin du code de SingleNegationElimination, mais j'ai eu un problème avec les données contenant des caractères non utf-8. Celles-ci sont apparues dans des domaines qui ne m'intéressaient pas trop, j'ai donc choisi de les ignorer. Cependant, cela a demandé des efforts. Je suis nouveau sur python, donc avec quelques essais et erreurs, je l'ai fait fonctionner. Le code est une copie de SingleNegationElimination avec la gestion supplémentaire de utf-8. J'ai essayé de le faire avec https://docs.python.org/2.7/library/csv.html mais j'ai finalement abandonné. Le code ci-dessous a fonctionné.
la source
Que diriez-vous d'utiliser Pandas pour lire le fichier csv dans un DataFrame ( pd.read_csv ), puis de manipuler les colonnes si vous le souhaitez (en les supprimant ou en mettant à jour les valeurs) et enfin en reconvertissant le DataFrame en JSON ( pd.DataFrame.to_json ).
Remarque: je n'ai pas vérifié à quel point cela sera efficace, mais c'est certainement l'un des moyens les plus simples de manipuler et de convertir un grand csv en json.
la source
En tant que légère amélioration de la réponse @MONTYHS, itération à travers une tup de noms de champ:
la source
la source
DictReader
, donc il devine les noms de champ à partir de la première ligne du fichier d'entrée: John, Doe, 5, "None" au lieu de "FirstName, lastname" et ainsi de suite ...TypeError: expected string or buffer