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 :

Stocker un tableau dans une base de données


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Stocker un tableau dans une base de données
    Bonjour,
    je voudrais stocker des tableaux comme par exemple [None, '+', [['2'], 0, [[None, '^', ['3', '4']]], 0, ['5']]] associé au texte 2+3^4+5 mais aussi à un autre texte (le chemin vers une image de la formule mise en forme) dans une base de données. Je crois savoir que Pickle peut être utile à cela.

    Comme puis-je faire cela ? Et aussi comment puis-je ensuite chercher la clé 2+3^4+5 pour récupérer le tableau [None, '+', [['2'], 0, [[None, '^', ['3', '4']]], 0, ['5']]] et le chemin de l'image associée à la formule.

    Toute info est la bienvenue.

    Par avance merci.

    PS : je n'y connais absoluement rien en BDD mais je suis prêt à apprendre. L'idéal serait d'avoir une solution très performante.

  2. #2
    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,

    Avec le module shelve, on peut stocker sur disque des objets python, et les récupérer à l'identique (en type et en valeur). Tu peux t'inspirer de mon tuto ici: http://python.jpvweb.com/mesrecettes...e_recup_objets. J'ai vérifié que ça marche pour les 2 objets que tu cites.

    Par contre, je comprend pas bien la relation entre tes 2 objets. Si "2+3^4+5" est une clé, et si tes données ne sont pas trop nombreuses, peut-être aurais-tu intérêt à créer un dictionnaire (clé:valeur), et stocker le dictionnaire avec shelve. Ce qui nécessiterait de relire la totalité du dictionnaire à chaque nouvelle session. Mais une fois en mémoire, la liaison clé-valeur d'un dictionnaire est très efficace (hashcode).

    Tyrtamos
    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

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Par contre, je comprend pas bien la relation entre tes 2 objets. Si "2+3^4+5" est une clé, et si tes données ne sont pas trop nombreuses, peut-être aurais-tu intérêt à créer un dictionnaire (clé:valeur), et stocker le dictionnaire avec shelve. Ce qui nécessiterait de relire la totalité du dictionnaire à chaque nouvelle session. Mais une fois en mémoire, la liaison clé-valeur d'un dictionnaire est très efficace (hashcode).
    C'est vrai c'est plus simple. En plus comme je veux juste avoir le tableau et l'image à partir de la clé, il est inutile d'utiliser une BDD. Au temps pour moi...


    Merci pour le tutoriel et aussi pour ta remarque judicieuse.

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Sur ta page qui est très limpide, la 2nde méthode est-elle plus lente ou les performances sont-elles identiques à l'utilisation du module shelve ?

  5. #5
    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
    Citation Envoyé par rambc Voir le message
    Sur ta page qui est très limpide, la 2nde méthode est-elle plus lente ou les performances sont-elles identiques à l'utilisation du module shelve ?
    Je n'ai pas fait beaucoup de tests de performance, mais ceux que j'ai fait montrent une certaine équivalence dans la durée des opérations (de 1/2 à 2/1 selon l'instruction considérée), ce qui fait que, pour moi, le temps d'exécution ne semble pas être un critère de choix important. Mais devant un programme précis dont le temps est critique, il est peut-être intéressant de refaire ce test, car le résultat dépend de la fréquence relative entre les lectures et les écritures.

    En fait, je n'ai cherché la 2ème méthode que parce que je voulais pouvoir intervenir directement sur le fichier avec un éditeur. Mais si on n'a pas besoin de ça, shelve est très bien et conduit à du code très simple.

    Tyrtamos
    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

  6. #6
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bonjour à tous,
    étant dans ma période XML... je propose l'approche suivante.
    L'intérêt étant celui du langage XML (fichier structuré, portabilité, récursivité ...),
    C'est informatif à vous de voir si c'est intéressant par rapport shelve (que je ne connaissait pas d'ailleurs) merci à Tyrtamos

    Alex

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #!/usr/bin/env python
    #coding=utf-8
    import xml.etree.ElementTree as ET
     
    def recupOPERATION(formule):
        '''Récupération des formules'''
        print "(",
        recupTerme(formule.findall('OPERATION')[0])
        print
     
    def recupTerme(termes):
        '''Récupération des termes'''
        signe=termes.findall('SIGNE')[0].text
        for i,terme in enumerate(termes.findall('TERME')):
            if len(terme.findall('SIGNE'))>0: # Si le terme est une opération => appel récursif
                print signe,"(",
                recupTerme(terme)
            else:
                if i!=0:
                    print signe,            
                print terme.text,
        print ")",
     
     
    xml = '''<?xml version="1.0" encoding="UTF-8"?>
    <XMLFORMULES>
        <FORMULE>
            <CLE>2+3^4+5</CLE>
            <URL>http://www.google.fr/</URL>
            <OPERATION>
                <SIGNE>+</SIGNE>
                <TERME>2</TERME>
                <TERME>
                    <SIGNE>^</SIGNE>
                    <TERME>3</TERME>
                    <TERME>4</TERME>
                </TERME>
                <TERME>5</TERME>
            </OPERATION>            
        </FORMULE>      
        <FORMULE>
            <CLE> 2+4+(8-9-(3^4))</CLE>
            <URL>http://www.google.fr/</URL>
            <OPERATION>
                <SIGNE>+</SIGNE>
                <TERME>2</TERME>
                <TERME>4</TERME>
                <TERME>
                    <SIGNE>-</SIGNE>
                    <TERME>8</TERME>
                    <TERME>9</TERME>
                    <TERME>
                        <SIGNE>^</SIGNE>
                        <TERME>3</TERME>
                        <TERME>4</TERME>
                    </TERME>
                </TERME>
            </OPERATION>            
        </FORMULE>      
    </XMLFORMULES>
    '''
     
    # Récupération des formules
    ElementDocument=ET.fromstring(xml)
    formules=ElementDocument.findall('FORMULE')
     
    # Affichage de toutes les formules
    for formule in formules:
        print "\nNouvelle formule --------------"
        for cle in formule.findall('CLE'):
            print "Cle : ",cle.text
        for url in formule.findall('URL'):
            print "url : ",url.text
        recupOPERATION(formule)
        print "----------------------------------"
     
    fo=open("XMLFORMULES.XML","w")
    fo.write(ET.tostring(ElementDocument))
     
    # Recherche conditionnelle
    formule=[f for f in formules if f.find("CLE").text=="2+3^4+5"][0]
    recupOPERATION(formule)

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci pour l'idée du XML mais dans mon cas la méthode shelve sera amplement suffisante. De plus, je n'ai pas besoin de stocker des données portables car le but est juste de les stocker localement pour que l'utilisateur puisse réutiliser des images de formules qu'il a déjà rencontré.

  8. #8
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Pas de problème

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

Discussions similaires

  1. stocker des fichiers dans une base de donnée MYSQL
    Par Invité(e) dans le forum MySQL
    Réponses: 5
    Dernier message: 03/12/2009, 13h10
  2. Réponses: 0
    Dernier message: 23/07/2009, 09h37
  3. [MCD]Tableau dans une base de données
    Par gollunk dans le forum Schéma
    Réponses: 9
    Dernier message: 29/10/2008, 10h20
  4. Stocker les sessions dans une base de données
    Par mic79 dans le forum Langage
    Réponses: 7
    Dernier message: 06/04/2006, 21h57
  5. Comment stocker des images dans une base de données ?
    Par [Silk] dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/07/2005, 11h29

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