IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Ouvrir un fichier avec des objets { -- }


Sujet :

Python

  1. #1
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut Ouvrir un fichier avec des objets { -- }
    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

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    une méthode simple pour ne pas trop s’embêter pourrait être de donner "[" + contenu_du_fichier + "]" à json.dumps

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par flapili Voir le message
    une méthode simple pour ne pas trop s’embêter pourrait être de donner "[" + contenu_du_fichier + "]" à json.dumps
    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...

  5. #5
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    à 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:
    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'}"]
    , s'il y a des sous objects dans les objects rien n'empêche de rendre la fonction récursive

    bon bien sur cette fonction se plante totalement si ça ne respecte pas le format, autrement dit ce n'est pas très robuste.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par flapili Voir le message
    J'avais également pensé à faire un split en fonction de "}{" mais si il y a des sous objets ça complique les choses,
    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...

    Citation Envoyé par flapili Voir le message
    un petit algorithme basé sur un compteur devrait toujours être un peut plus simple que de sortir les regex tous de suite:
    Oui je suis d'accord...
    Je vais regarder ton code...

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par flapili Voir le message
    , s'il y a des sous objects dans les objects rien n'empêche de rendre la fonction récursive
    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 :

    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)
    Permet d'avoir ç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"}']
    au lieu de ç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
    ['\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']

  8. #8
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    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 {...}{...}

    altme.zip

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    Salut,

    Citation Envoyé par bm Voir le message
    Je pensais que c'était possible avec pandas et sans entrer dans les détails.
    Vous pourriez tester! (et lire la documentation).

    Cela vient de contacts avec des américains sur le covid.
    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.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    wiztricks :

    Je ne vais pas m'excuser parce que je ne sais pas tout sur Pandas.
    Vous n'avez qu'à déplacer ce post.


  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    Citation Envoyé par bm Voir le message
    Je ne vais pas m'excuser parce que je ne sais pas tout sur Pandas.
    Vous n'avez qu'à déplacer ce post.
    Posez des questions claires dans le bon forum, avec un sujet bien défini par discussion, montrant qu'on a cherché avant de poster,...
    C'est vous qui demandez de l'aide.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    Le sujet est résolu et une méthode est proposée.

  13. #13
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    Salut,

    Citation Envoyé par bm Voir le message
    pour regrouper les json ( et avec une virgule entre json , ce qui est fastidieu )
    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.

    Il n'y a pas de forum dédié à pandas :
    Calcul Scientifique, Bibliothèques Tierces.

    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    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.


  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par bm Voir le message
    220 lectures de ce post : la question posée n'était pas misérable.
    Oui la question posée n'est pas "misérable" et d'ailleurs tu as reçu des réponses, il y a le code de flapili qui te permet de faire automatiquement ce que tu as fait manuellement, c'est donc moins fastidieux mais tu n'en as pas tenu compte apparemment...

  17. #17
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    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 ...

  18. #18
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    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...

  19. #19
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    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

  20. #20
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Peut-on savoir quels calculs tu veux faire ?
    Il te faut obligatoirement utiliser Pandas pour faire ces calculs ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD-2013] Ouvrir un fichier avec des caracteres variables.
    Par sudiste33 dans le forum VBA Word
    Réponses: 14
    Dernier message: 23/12/2016, 05h32
  2. Impossible d'ouvrir nom de fichier avec des accents
    Par sargei dans le forum Langage
    Réponses: 15
    Dernier message: 10/06/2009, 10h46
  3. ouvrir un fichier avec colonne en focntion des séparateurs
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/07/2007, 10h14
  4. Réponses: 1
    Dernier message: 23/07/2007, 11h00
  5. [ API JDIC ] Ouvrir un fichier avec des paramètres
    Par macmanus dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/05/2007, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo