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
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écursive
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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']
Partager