Bonjour,
Je cherche la méthode pour ouvrir un fichier contenant des objets.
De cette forme :
{ ... }{ ... }{ ... }
Chaque objet est un json de 100 à 150 lignes, et il n'y a pas de virgule pour séparer les objets.
@+ pour un conseil
Version imprimable
Bonjour,
Je cherche la méthode pour ouvrir un fichier contenant des objets.
De cette forme :
{ ... }{ ... }{ ... }
Chaque objet est un json de 100 à 150 lignes, et il n'y a pas de virgule pour séparer les objets.
@+ pour un conseil
Salut,
La méthode pour ouvrir un fichier json, c'est toujours open!
Après pour lire un fichier qui contient plusieurs objets json en série...
Le plus simple serait d'avoir écrit un array json au départ.
Après, vous pouvez essayer de vous baser sur les délimiteurs { et } pour trouver début et fin, soit en les comptants soit avec les expressions régulières.
- W
une méthode simple pour ne pas trop s’embêter pourrait être de donner "[" + contenu_du_fichier + "]" à json.dumps
Salut,
C'est aussi ce à quoi j'avais pensé mais en fait ce n'est pas bon car il est précisé que les différents objets ne sont pas séparés par des virgules...
A l'intérieur des accolades il peut y avoir d'autres accolades...
Il peut y avoir aussi le cas où une accolade serait utilisée comme caractère (dans une chaine par exemple).
Il faudrait faire un petit parseur...
à oui autant pour moi, j'ai lu trop vite.
En général ont dit qu'il y à tel délimiteur soit on dit qu'il n'en a aucun, mais dire qu'ils ne sont pas séparés par des virgules m'a fait tombé dans le panneau.
J'avais également pensé à faire un split en fonction de "}{" mais si il y a des sous objets ça complique les choses,
un petit algorithme basé sur un compteur devrait toujours être un peut plus simple que de sortir les regex tous de suite:
, s'il y a des sous objects dans les objects rien n'empêche de rendre la fonction récursiveCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 >>> def parse(s): l = [] c = 0 pos = 0 for i, char in enumerate(s): if char == "{": c += 1 elif char == "}": c -= 1 if c == 0: l.append(s[pos:i+1]) pos = i+1 return l >>> parse("{'foo': 'bar'}{'foo2': 'bar2'}{'foo3': 'bar3'}") ["{'foo': 'bar'}", "{'foo2': 'bar2'}", "{'foo3': 'bar3'}"]
bon bien sur cette fonction se plante totalement si ça ne respecte pas le format, autrement dit ce n'est pas très robuste.
Ah cela me semble une piste, les sous objets ne devraient pas poser de problèmes car eux devront être séparés par une virgule... Par contre entre ces deux accolades il pourrait y avoir des espaces et/ou des sauts de lignes...
Oui je suis d'accord...
Je vais regarder ton code...
Ben en fait pas besoin car avec ton code tu obtiens bien une liste des objets après c'est facile de traiter chaque objet de la manière habituelle, ton code répond donc au problème...
Sauf une chose dans certains cas, certains éléments de la liste peuvent être des espaces et/ou des sauts de ligne, pour éviter cela j'ai juste ajouté une petite condition à ton code :
Permet d'avoir ça :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 def parse(s): l = [] c = 0 pos = 0 for i, char in enumerate(s): if char == "{": c += 1 elif char == "}": c -= 1 if c == 0: if s[pos] == "{": l.append(s[pos:i+1]) pos = i+1 return l chaine = ''' { "foo": "bar", "toto:": {"a":"aaa", "b":"bbb", "c": "ccc"} "zozo:": {"a1":"aaa1", "b1":"bbb1", "c1": "ccc1"} } {"foo2": "bar2"} {"foo3": "bar3"} {"foo4": "bar4"} {"foo5": "bar5"} ''' res = parse(chaine) print(res)
au lieu de ça :Code:
1
2
3
4
5 ['{\n "foo": "bar",\n "toto:": {"a":"aaa", "b":"bbb", "c": "ccc"}\n "zozo:": {"a1":"aaa1", "b1":"bbb1", "c1": "ccc1"}\n}', '{"foo2": "bar2"}', '{"foo3": "bar3"}', '{"foo4": "bar4"}', '{"foo5": "bar5"}']
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ['\n', '{\n "foo": "bar",\n "toto:": {"a":"aaa", "b":"bbb", "c": "ccc"}\n "zozo:": {"a1":"aaa1", "b1":"bbb1", "c1": "ccc1"}\n}', '\n', '\n', '\n', '{"foo2": "bar2"}', ' ', ' ', ' ', ' ', '{"foo3": "bar3"}', '\n', '\n', '{"foo4": "bar4"}', '\n', '{"foo5": "bar5"}', '\n', '\n', '\n']
Merci de vos conseils.
Je ne sais pas encore ce que l'ouverture du json peut apporter.
Je pensais que c'était possible avec pandas et sans entrer dans les détails.
Cela vient de contacts avec des américains sur le covid.
Je poste en fichier joint les 2 premiers {...}{...}
Pièce jointe 563688
Salut,
Vous pourriez tester! (et lire la documentation).
Le COVID n'est pas une excuse: une séquence d'objets JSON est gérable pour autant qu'on sache séparer les différents objets. Si c'est un objet par ligne, c'est facile... si c'est plus compliqué, ben, il faut coder en s'appuyant sur les spécificités des enregistrements.Citation:
Cela vient de contacts avec des américains sur le covid.
- W
wiztricks :
Je ne vais pas m'excuser parce que je ne sais pas tout sur Pandas.
Vous n'avez qu'à déplacer ce post.
:mrgreen:
Le sujet est résolu et une méthode est proposée.
Il n'y a pas de forum dédié à pandas :
En ajoutant ceci pour regrouper les json ( et avec une virgule entre json , ce qui est fastidieu )
{"programs" : [
]}
Pandas peut construire une DataFrame :
Code:
1
2
3
4
5
6
7
8
9 import json import pandas as pd from pandas.io.json import json_normalize with open('altme.json') as f: d = json.load(f) nycphil = json_normalize(d['programs']) nycphil.head(3)
Salut,
Pour que ce soit moins fastidieux, çà se code...
Et une bonne partie de ce code vous a été donné dans les réponses précédentes.
Si vos objets JSON commencent par une ligne contenant "{\n" et se terminent par une ligne contenant "}\n", on peut faire plus simple.
Calcul Scientifique, Bibliothèques Tierces.Citation:
Il n'y a pas de forum dédié à pandas :
Un sujet panda aurait été, ".read_json permet la lecture d'objet séparés par des fin de lignes, y-a-t-il moyen de lui préciser le séparateur lorsque ce n'est pas le cas?".
Comme çà ne fait que ce qui est documenté, la réponse aurait été négative.
Et vous vous retrouvez à coder pour que le JSON que vous voulez récupérer par Pandas ressemble à un JSON que pandas (et autres) acceptent.
- W
Calcul Scientifique, Bibliothèques Tierces.
Très bien pour commencer à écrire sa bibliothèque complète python.
Mon codage va continuer et sans aller plus loin sur ce forum.
Les initiés, sur ce forum, commencent par un codage standard,
qui plaira à la modération. Les autres posent la question basique
et sont ensuite sous le feu de la critique.
220 lectures de ce post : la question posée n'était pas misérable.
:mouarf:
Pour l'heure un forum dédié Pandas serait également peu productif.
Il y a des librairies C pour augmenter Pandas.
Le fichier initial json est de 1 518 106 lignes
Je peux découper les 20 ou 30 premiers json avec python et ensuite cela ne fonctionne plus.
Il y a aucune erreur python qui doit ensuite saturer sa pile de calcul.
Je laisse ce forum à ceux qui poursuive des études tranquilles ...
Salut,
Tu n'as pas besoin de Pandas pour récupérer tous les objets...
Tu peux même les mettre dans plusieurs fichiers si tu veux des fichiers plus petits...
Le découpage avec petits fichiers entraîne une perte.
Estimation : 1350 json dans pandas ( ou 1350 ligne dans une table )
Pandas est la matrice de calcul
Peut-on savoir quels calculs tu veux faire ?
Il te faut obligatoirement utiliser Pandas pour faire ces calculs ?