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 :

csv en json imbriqués (nested)


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut csv en json imbriqués (nested)
    Bonjour,

    Je ne trouve pas la solution à partir d'un csv je cherche à obtenir un json imbriqué, j'ai essayé pas mal de chose avec pandas etc,

    voici un échantillon de mon csv:
    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
    Language,IsoPays,Pays,Region,Departement,Commune,Massif,Bassin,Courseau
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Saint-Michel-les-Portes,Vercors,Drac,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Saint-Andéol,Vercors,Drac,Le Ruisseau de Berrièves
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Varces-Allières-et-Risset,Vercors,Drac,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Engins,Vercors,Isère,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Sassenage,Vercors,Isère,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Montaud,Vercors,Isère,Ruisseau des Gorges
    en,FR,France,Auvergne-Rhône-Alpes,Isère,La Rivière,Vercors,Isère,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Saint-Gervais,Vercors,Isère,La Drevenne
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Saint-Gervais,Vercors,Isère,Le ruisseau des grandes routes
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Rovon,Vercors,Isère,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Malleval-en-Vercors,Vercors,Isère,La Gerlette
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Malleval-en-Vercors,Vercors,Isère,La Serve
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Izeron,Vercors,Isère,
    en,FR,France,Auvergne-Rhône-Alpes,Isère,Rencurel,Vercors,Bourne,
    en,FR,France,Auvergne-Rhône-Alpes,Ain,Seillonnaz,Bugey,,
    en,FR,France,Auvergne-Rhône-Alpes,Ain,Champagne-en-Valromey,Bugey,,
    en,FR,France,Auvergne-Rhône-Alpes,Ain,Bénonces,Bugey,Rhône,La Pernaz
    en,FR,France,Auvergne-Rhône-Alpes,Ain,Villebois,Bugey,,
    en,FR,France,Auvergne-Rhône-Alpes,Ain,Surjoux,,Rhône,
    en,FR,France,Auvergne-Rhône-Alpes,Haute-Savoie,Servoz,Chablais - Platé - Aiguilles Rouges,Arve,
    en,FR,France,Auvergne-Rhône-Alpes,Haute-Savoie,Lovagny,Bornes - Aravis,,
    en,FR,France,Auvergne-Rhône-Alpes,Haute-Savoie,Mieussy,Chablais - Platé - Aiguilles Rouges,Giffre,Le Giffre
    en,FR,France,Occitanie,Pyrénées-Orientales,Vernet-les-Bains,Canigou,La Tet,
    en,FR,France,Occitanie,Pyrénées-Orientales,Thuès-Entre-Valls,Canigou,La Tet,Fajet
    en,FR,France,Occitanie,Pyrénées-Orientales,Saint-Paul-de-Fenouillet,Corbières,,L'Agly
    en,FR,France,Occitanie,Pyrénées-Orientales,Prats-de-Mollo-la-Preste,Canigou,Le Tech - Vallespir,Le Tech
    en,FR,France,Occitanie,Pyrénées-Orientales,Arles-sur-Tech,Albères,Le Tech - Vallespir,Ravin de la Seignoural
    J'aimerais obtenir un json comme celui-ci, je veux ensuite l'intégrer dans une base Sql mais je galère un peu... Normalement je n'aurais pas de doublons

    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
    {
     
      "language": "string",
      "name": "string",
      "regions": [
        {
          "name": "string",
          "states": [
            {
              "name": "string",
              "cities": [
                {
                  "name": "string",
                  "moutains": [
                    {
                      "name": "string",
                      "bassins": [
                        {
                          "name": "string",
                          "rivers": [
                            {
                              "name": "string"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
    Sur un autre projet j'avais un json que je devais mettre en forme en csv et c'était bizarrement bien plus simple.

    Merci d'avance pour votre aide !!!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 700
    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 700
    Par défaut
    Salut,

    Citation Envoyé par Bigoudi88 Voir le message
    J'aimerais obtenir un json comme celui-ci, je veux ensuite l'intégrer dans une base Sql mais je galère un peu...
    Côté Python, c'est juste construire une structure composée de listes et de dictionnaires que l'on convertit en JSON avec le module json.

    Sûr que faire le mapping du CSV dans la structure JSON évoquée, c'est du boulot (et de la méthode) mais plus du boulot "avant" de programmer qu'un sujet de programmation Python.

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

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut
    Oui c'est de la méthode plus qu'un sujet de programmation... mais je ne la trouve pas... J'ai essayer plein de trucs mais je n'arrive pas à voir la solution d'où mon message...
    J'ai essayé ceci que j'ai du mal à comprendre d'ailleurs:
    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
    # coding: utf8
     
    import pandas as pd
    import json
     
    df = pd.read_csv ('testjsoncountry.csv')
     
    #print(df.columns)
     
    s = df.set_index(df.columns[:-1].tolist())[df.columns[-1]]
     
     
    def redict(s):
        if s.index.nlevels == 1:
            return s.to_dict()
     
        else:
            return {k: redict(g.xs(k)) for k, g in s.groupby(level=0)}
     
    redict(s)
    qui me donne quasiment ce que je veux mais je n'arrive pas à modifier le code pour avoir le résultat voulu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {'en': {'FR': {'France': {'Auvergne-Rhône-Alpes': {'Ain': {'Belleydoux': {'Jura': {'Rhône': 'Semine'}},
          'Boyeux-Saint-Jérôme': {'Bugey': {nan: nan}},
          'Bénonces': {'Bugey': {'Rhône': nan}},
          'Cerdon': {'Bugey': {nan: nan}},
          'Chaley': {'Bugey': {nan: 'Albarine'}},
          'Champagne-en-Valromey': {'Bugey': {nan: nan}},
          'Champfromier': {'Jura': {nan: nan}},
          'Chézery-Forens': {'Jura': {nan: nan}},
          'Contrevoz': {'Bugey': {nan: nan}},
          'Dortan': {'Jura': {'Bienne': nan}},
          'Hauteville-Lompnes': {'Bugey': {nan: nan}},
          'La Burbanche': {'Bugey': {nan: nan}},
          'Lompnas': {'Bugey': {nan: 'La Brive'}},
    La je suis parti sur ce genre d'idée... Mais je tatonne encore...:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    import pandas as pd
    import json
    pd.options.display.max_columns = None
    pd.options.display.max_rows = None
     
    jsondeouf=[]
    df = pd.read_csv ('all_paysdatacanyoncsv.csv', encoding='utf-8')
     
    LangueUnique = pd.unique(df['Language'])
    IsoPaysUnique = pd.unique(df['IsoPays'])
    PaysUnique = pd.unique(df['Pays'])
    RegionsUnique = pd.unique(df['Regions'])
    StatesUnique = pd.unique(df['States'])
    CitiesUnique = pd.unique(df['Cities'])
    MountainsUnique = pd.unique(df['Mountains'])
    BassinsUnique = pd.unique(df['Bassins'])
    RiversUnique = pd.unique(df['Rivers'])
     
    df2=df[df['Pays']=='France']
    df3=df2[df2['States']=='Isère']
    df4=df3[df3['Cities']=='Clara']
     
     
     
    if df4.empty:
        print("c'estvide")
     
    for l in LangueUnique:
        df1=df[df['Language']==l]
        for p in PaysUnique:
            df2=df1[df1['Pays']==p]
            for r in RegionsUnique:
                df3=df2[df2['Regions']==r]
                for s in StatesUnique:
                    df4=df3[df3['States']==s]
                    for c in CitiesUnique:
                        df5=df4[df4['Cities']==c]
                        for m in MountainsUnique:
                            df6=df5[df5['Mountains']==m]
                            for b in BassinsUnique:
                                df7=df6[df6['Bassins']==b]
                                for ri in  RiversUnique:
                                    df8=df7[df7['Rivers']==ri]
                                    print(ri)

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 700
    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 700
    Par défaut
    Salut,

    Déjà je ne vois pas pourquoi vous partez à utiliser Panda pour çà.
    Lire un fichier CSV peut se faire "à la main" ou en utilisant le module CSV (standard).

    Et pour créer un composite de dictionnaires et de listes, dict et list du Python de base suffisent.

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

  5. #5
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut
    je ne suis pas un expert en python mais je pensais que ça serait peut être plus facile avec les outils panda...
    Je vais regarder d'autres solutions, je test, comme je le dit je ne vois pas la solution sinon je ne serais pas là...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 700
    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 700
    Par défaut
    Citation Envoyé par Bigoudi88 Voir le message
    Je vais regarder d'autres solutions, je test, comme je le dit je ne vois pas la solution sinon je ne serais pas là...
    Si vous ne connaissez pas trop les objets et les constructions de base du langage... vous ne vous en sortirez pas sauf si çà amuse quelqu'un de coder çà pour vous.

    Ca arrive... si le sujet intéresse quelqu'un qui trouve matière à faire un exercice intéressant. Mais globalement, on ne va pas votre boulot...

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

  7. #7
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut
    Oui je ne connais pas trop du coup je cherche des conseils et je ne connaissais pas le module csv, et ce que je cherche c'est à faire un parsing... je viens de trouver le terme, c'est peut être basique pour vous mais pas pour moi qui suis géologue et pas informaticien ça me change de mes cailloux Mais je vais trouver la solution à force

  8. #8
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut
    J'ai trouvé

    Ca va rensembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # coding: utf8
    import csv
    import json
    test=[]
     
    with open("all_paysdatacanyoncsv.csv") as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            test=[dict([(c, row[c]) for c in ['Language','IsoPays','NameCountry']]+[('Regions',
            dict([(c,row[c]) for c in ['NameRegion']]+[('States',dict([(c,row[c]) for c in ['NameStates']]))]))])]
            print(test)
    print(test)
    J'ai pas encore terminé mais cela devrait fonctionner... Après je peux surement améliorer le code pour quelque chose de plus propre...

  9. #9
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 15
    Par défaut
    J'ai trouvé et c'était pas facile vu qu'il n'y a rien sur le net, j'espère que cela servira à quelqu'un qui à le même problème !!!

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    import pprint, json
     
    res = []
     
    coalesce = lambda x: x if x else 'undefined'
     
    country = lambda item: (coalesce(item['NameCountry']), {
        'language': coalesce(item['Language'])
        ,'isoPays': coalesce(item['IsoPays'])
        ,'pays': coalesce(item['NameCountry'])
        ,'Regions': []
    })
     
    region = lambda item: (coalesce(item['NameRegion']), {
        'name': coalesce(item['NameRegion'])
        ,'States': []
    })
     
    state = lambda item: (coalesce(item['NameStates']), {
        'name': coalesce(item['NameStates'])
        ,'Cities': []
    })
     
    city = lambda item: (coalesce(item['NameCity']), {
        'name': coalesce(item['NameCity'])
        ,'Mountains': []
    })
     
    mountain = lambda item: (coalesce(item['NameMountain']), {
        'name': coalesce(item['NameMountain'])
        ,'Bassins': []
    })
     
    bassin = lambda item: (coalesce(item['NameBassin']), {
        'name': coalesce(item['NameBassin'])
        ,'Rivers': []
    })
     
    river = lambda item: (coalesce(item['NameRiver']), {
        'name': coalesce(item['NameRiver'])
    })
     
    tree_conf = [
        (country, 'Regions', {})
        ,(region, 'States', {})
        ,(state, 'Cities', {})
        ,(city, 'Mountains', {})
        ,(mountain, 'Bassins', {})
        ,(bassin, 'Rivers', {})
        ,(river, None, {})
    ]
     
    with open('all_paysdatacanyoncomplete.csv', 'r') as f:
        header = f.readline().strip().split(',')
        for row in f.readlines():
            item = dict(zip(header, row.strip().split(',')))
            last = res
            for conf in tree_conf:
                key, value = conf[0](item)
                if not key in conf[2]:
                    conf[2][key] = value
                    last.append(value)
                if conf[1]:
                    last = conf[2][key][conf[1]]
     
    with open('res.json', 'w') as f:
        json.dump(res, f, ensure_ascii=False)

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 700
    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 700
    Par défaut
    Bravo!

    Maintenant que votre solution est sur Internet...

    Quels mots clefs taper pour tomber dessus?
    Pas facile hein?

    En fait, mouliner des données récupèrer suivant un schéma et les mettre en forme dans un autre schéma est une activité qui occupe pas mal. On dit même "faire une moulinette pour"...

    Solutions particulières à des problèmes particuliers, on a "industrialisé" cette activité en fabriquant des ETL.
    Des outils couteux qui demandent un long apprentissage.

    Et ceux qui n'ont pas les moyens de s'en offrir continuent à écrire des moulinettes difficilement réutilisables.

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

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

Discussions similaires

  1. modifier affichage date après conversion csv en json
    Par GUL75 dans le forum Général Python
    Réponses: 2
    Dernier message: 17/11/2016, 09h05
  2. JSON/Spring et les objets imbriqués
    Par Fractaliste dans le forum Spring Web
    Réponses: 0
    Dernier message: 28/03/2014, 13h16
  3. comment parser un fichier csv qui contient des ligne en json
    Par khadi8 dans le forum Général Python
    Réponses: 4
    Dernier message: 07/02/2014, 21h07
  4. Parser deux tableaux JSON imbriqués
    Par Arwa89 dans le forum Android
    Réponses: 2
    Dernier message: 21/04/2013, 00h37
  5. Convertir JSON en .CSV
    Par Gaetch dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 07/06/2012, 13h35

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