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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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']

+ Répondre à la discussion
Cette discussion est résolue.

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