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 :

[Débutant] Créer un fichier qui se comporte comme un dicitonnaire [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 31
    Points : 25
    Points
    25
    Par défaut [Débutant] Créer un fichier qui se comporte comme un dicitonnaire
    Bonjour,

    Je souhaiterais savoir comment je peux sauvegarder un dictionnaire créé à partir de la lecture d'un fichier texte dans un autre fichier.

    Pour illustrer mon problème, j'ai en entrée un looooooong fichier texte du style :
    chien animal
    chat animal
    iris fleur
    ...
    Dans un premier programme, j'extrais les données et je les stocke dans un dictionnaire du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'animal': [chien,chat], "fleur" : [iris]}
    Mais j'aimerais bien créer un fichier 'monFichierDico' indépendant de ce programme qui se comporte comme un dictionnaire de façon à ce que si je fais depuis n'importe quel programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     print(monFichierDico[animal])
    j'obtienne aussitôt le résultat [chien,chat].

    J'espère que vous comprendrez ce que je veux faire Comme mon fichier est très gros, ça m'arrangerait d'avoir un accès direct à chaque clé.

    Merci !!

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tu mélanges allègrement deux problèmes qui, pris individuellement, ont chacun des solutions distinctes.
    1) pour exporter un dictionnaire (ou plus généralement un objet Python) il existe le module "pickle" pour Python3 et "cPickle" pour Python2. Ca t'exporte un objet en binaire et/ou importe un flux binaire analogue en objet Python. Tu peux y rajouter le module "zlib" qui te permet de compresser le résultat et éventuellement le module "hexlify" qui te permet de convertir un flux binaire en flux texte. Ensuite tu écris le tout dans un fichier et pour le récupérer ben tu passes le tout dans l'autre sens.
    2) la façon dont tu utilise(rai)s ton fichier ressemble fortement à une interrogation SQL. Tu peux donc utiliser le module "sqlite3" qui te permet de créer un fichier se comportant exactement comme une base de données. Tu peux y créer des tables, des index, des clefs primaires, étrangères et bien entendu effectuer des requêtes

    Chacune de ces solutions est optimale pour chaque problème. Ca veut dire que bien entendu rien ne t'empêche de te créer ton propre fichier à ta sauce avec ton outil de requêtage mais quoi que tu fasses, tu seras toujours moins performant que ce qui t'es offert en standard.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Les deux formats les plus courants sont pickle et json.

    pickle produira un binaire illisible dans un éditeur mais il permet d'enregistrer des objets (classes) ce que ne permet pas json.

    Exemple basique:
    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
     
    # -*- coding: utf-8 -*-
     
    import pickle
    import json
     
    dict = {"fruits": ["pomme", "orange", "poire"], 
            "animaux": ["mouton", "chien", "cheval"]}
     
    # Avec pickle
    with open("mydict_pickle", "wb") as outf:
        pickle.dump(dict, outf)
     
    # Avec json
    with open("mydict_json", "wb") as outf:
        jsn = json.dumps(dict, sort_keys=True, indent=4, 
                         separators=(',', ': '), ensure_ascii=False)
        outf.write(jsn.encode('utf-8', 'replace'))
     
    # Lecture
    with open("mydict_pickle", "rb") as inf:
        data = pickle.load(inf)
    print(data)
     
    with open("mydict_json", "rb") as inf:
        content = inf.read()
        data = json.loads(content)
    print(data)
    Personnellement, j'utilise journellement un json de plus de 3000 lignes de données et il est chargé en mémoire quasi instantanément.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour stocker des données, je préfère pour ma part le module shelve, qui stocke et récupère les données sous forme de dictionnaire.

    Voilà un petit exemple qui montre que tous les types de données de base de Python sont bien conservés, ce qui est très pratique:

    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
    # -*- coding: utf-8 -*-
    # Python 3.5
     
    import shelve
     
    # objets a sauvegarder sur disque et à récupérer
    L0 = True
    L1 = 123456
    L2 = 1.789e5
    L3 = complex(1,2)
    L4 = "ABC"
    L5 = 'DEF'
    L6 = [L0, L1, L2, L3, L4, L5]
    L7 = (L0, L1, L2, L3, L4, L5)
    L8 = {'L0':L0, 'L1':L1, 'L2':L2, 'L3':L3, 'L4':L4, 'L5':L5, 'L6':L6}
    L9 = set([L0, L1, L2, L3, L4, L5])
     
    # sauvegarde des objets
    with shelve.open('historiquedbm') as d:
        d['L0'] = L0
        d['L1'] = L1
        d['L2'] = L2
        d['L3'] = L3
        d['L4'] = L4
        d['L5'] = L5
        d['L6'] = L6
        d['L7'] = L7
        d['L8'] = L8
        d['L9'] = L9
     
    # récupération des objets sauvegardés
    with shelve.open('historiquedbm') as d:
        R0 = d['L0']
        R1 = d['L1']
        R2 = d['L2']
        R3 = d['L3']
        R4 = d['L4']
        R5 = d['L5']
        R6 = d['L6']
        R7 = d['L7']
        R8 = d['L8']
        R9 = d['L9']
     
    # affichage des objets récupérés
    print(R0, type(R0))
    print(R1, type(R1))
    print(R2, type(R2))
    print(R3, type(R3))
    print(R4, type(R4))
    print(R5, type(R5))
    print(R6, type(R6))
    print(R7, type(R7))
    print(R8, type(R8))
    print(R9, type(R9))
    print()
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    True <class 'bool'>
    123456 <class 'int'>
    178900.0 <class 'float'>
    (1+2j) <class 'complex'>
    ABC <class 'str'>
    DEF <class 'str'>
    [True, 123456, 178900.0, (1+2j), 'ABC', 'DEF'] <class 'list'>
    (True, 123456, 178900.0, (1+2j), 'ABC', 'DEF') <class 'tuple'>
    {'L6': [True, 123456, 178900.0, (1+2j), 'ABC', 'DEF'], 'L2': 178900.0, 'L4': 'ABC', 'L0': True, 'L3': (1+2j), 'L5': 'DEF', 'L1': 123456} <class 'dict'>
    {123456, True, (1+2j), 'ABC', 178900.0, 'DEF'} <class 'set'>
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Super !! Merci pour les différentes solutions que vous proposez, je vais regarder tout ça de plus près;

    Encore merci, je ne savais pas de quel côté rechercher !!

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mars 2014
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Mars 2014
    Messages : 158
    Points : 465
    Points
    465
    Par défaut
    Petite info complémentaire vu que personne en as parlé mais Pickle c'est dangereux, c'est vulnérable à de l’exécution de code lors du load donc si tu ne trust pas la source il faut éviter de l'utiliser.
    Json est aussi vulnérable à une faille d’exécution de code mais contrairement à pickle cela peut être corriger en utilisant safe_load à la place de load.
    Sqlite est parfait pour ce que tu veux en faire je pense.
    Shelve je connais pas ^^

    pickle produira un binaire illisible dans un éditeur mais il permet d'enregistrer des objets (classes) ce que ne permet pas json.
    json permet de sauvegarder des objets ^^ c'est d'ailleurs pour ça qu'ils est vulnérable à de l’exécution de code cf https://docs.python.org/2/library/json.html (la v3 est pareil) :

    Note

    JSON is a subset of YAML 1.2. The JSON produced by this module’s default settings (in particular, the default separators value) is also a subset of YAML 1.0 and 1.1. This module can thus also be used as a YAML serializer.
    et yaml est vulnérable à de l’exécution de code aussi. c.f https://blogs.cisco.com/security/tal...ulnerabilities

    P.S c'est pas pour faire peur juste informé ^^

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Merci Tagashy,

    Bon, j'ai commencé à utiliser Pickle (j'ai tenté sqlite mais j'ai rencontré un problème pour accéder aux données, j'ai d'ailleurs posté sur le sujet :
    https://www.developpez.net/forums/d1...-affiche-rien/
    )

    J'espère que Pickle fonctionnera bien quand même

    Bonne journée

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gingko41 Voir le message
    J'espère que Pickle fonctionnera bien quand même
    J'aime bien le "roll"... comme si les outils qu'on propose étaient foireux !!!
    Alors déjà si j'en crois ton titre tu es sous Python3 donc le module ne se nomme pas "Pickle" mais "pickle" (déjà dit en plus). C'est sûr que si tu te trompes de nom ça fonctionnera évidemment moins bien mais ce ne sera pas la faute du module.
    Et pour ton souci sqlite, j'ai répondu. Et bien évidemment le souci ne vient absolument pas du module (qui lui aussi fonctionne parfaitement) mais plutôt du développeur qui l'utilise.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Bonjour Sve@r,

    Je précise que le "roll" n'est en aucun cas utilisé pour signaler que les "outils proposés sont foireux", je ne me le permettrai pas vu que je ne suis pas informaticienne et que vous tous en savez bien plus que moi !

    c'est juste que j'espère que mon utilisation de novice ne fera pas que je l'utiliserai de façon non optimale et que ça bloquera à un moment donné (genre trop de données à stocker...)

    Et pour P/pickle, j'ai recopié le code proposé plus haut, là encore je ne savais pas qu'il pouvait y avoir des différences selon qu'on utilise des majuscules ou pas.

    Merci et bonne journée.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/08/2011, 15h34
  2. [EJB3] Un Ejb Stateless qui se comporte comme unEjb Stateful
    Par clem_alain dans le forum Java EE
    Réponses: 5
    Dernier message: 04/02/2011, 12h00
  3. Applet qui se comporte comme un textarea ?
    Par Rakken dans le forum Applets
    Réponses: 1
    Dernier message: 10/11/2008, 16h26
  4. GUI qui se comporte comme VS
    Par AlligO dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/05/2008, 13h09
  5. Browser qui se comporte comme mozilla ou comme ie, etc.
    Par Bad_Lemon dans le forum Réseau
    Réponses: 5
    Dernier message: 25/04/2007, 07h54

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