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 :

problème de cache [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut problème de cache
    Bonjour à tous,

    Tout d'abord voici 2 scripts,
    le premier :
    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
    import odf.opendocument
    import odf.text
    doc = odf.opendocument.OpenDocumentText()
     
     
    p1 = odf.text.P(parent=doc.text, text="paragraphe 1",classnames="1")
    p2 = odf.text.P(parent=doc.text, text="paragraphe 2",classnames="2")
    p3 = odf.text.P(parent=doc.text, text="paragraphe 3",classnames="3")
    p4 = odf.text.P(parent=doc.text, text="paragraphe 4",classnames="4")
     
     
    p1.parentNode.removeChild(p1)
    p2.parentNode.removeChild(p2)
    p3.parentNode.removeChild(p3)
    p4.parentNode.removeChild(p4)
     
     
    liste2=doc.getElementsByType(odf.text.P)
    print('liste2 : ',liste2) # Sans surprise, il n'y a aucun paragraphe...
    et donc ce code fonctionne.

    le second :
    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
    import odf.text
    doc = odf.opendocument.OpenDocumentText()
     
     
    p1 = odf.text.P(parent=doc.text, text="paragraphe 1",classnames="1")
    p2 = odf.text.P(parent=doc.text, text="paragraphe 2",classnames="2")
    p3 = odf.text.P(parent=doc.text, text="paragraphe 3",classnames="3")
    p4 = odf.text.P(parent=doc.text, text="paragraphe 4",classnames="4")
     
    liste=doc.getElementsByType(odf.text.P)
    print('len de liste : ',len(liste))
     
    for p in doc.getElementsByType(odf.text.P) :
        #doc.clear_caches()
        p.parentNode.removeChild(p)
     
    #doc.clear_caches()
    liste2=doc.getElementsByType(odf.text.P)
    print('len de liste2 : ',len(liste2)) # --> 2
     
    doc.save(r"C:\Users\chris\Documents\mesScryptPython\fichiers odt\tester_suppression.odt") # Pourquoi 2 paragraphes !!!
    Pourquoi ce code ne fonctionne pas ?

    J'ai beau essayez d'utiliser
    doc.clear_caches()
    mais sans succès.
    Si l'un de vous à un début de solution...

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 489
    Par défaut
    un message d'erreur ? si oui lequel ? (en entier)
    sinon plus de précision sur le "ça ne fonctionne pas"

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

    Citation Envoyé par Chris33 Voir le message
    Si l'un de vous à un début de solution...
    C'est super d'avoir écrit un petit exemple qui permet de reproduire facilement un comportement incohérent. Malheureusement, il n'y a que les développeurs de la bibliothèque qui pourront corriger ça (si vous les contactez via leur buglist par exemple).

    Histoire d'avancer (en attendant une correction officielle ou de meilleure idées) vous pourriez essayer de "répéter"ordonner les removeChild:

    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
    import odf.opendocument
    import odf.text
     
    doc = odf.opendocument.OpenDocumentText()
     
    for i in range(1, 5):
        odf.text.P(parent=doc.text, text=f"paragraphe {i}",classnames=f"{i}")
     
    def remove(e):
        if not e:
            return
        if e.nextSibling:
            remove(e.nextSibling)
        e.parentNode.removeChild(e)
     
     
    for e in doc.getElementsByType(odf.text.P):
        if e.parentNode:
            remove(e)
     
    print(doc.getElementsByType(odf.text.P))
    note: les éléments sont rangés dans des listes qui supportent mal les suppressions si on les effectue n'importe comment. L'idée est d'avoir une fonction récursive qui va commencer par détruire les derniers items.

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

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 489
    Par défaut
    on pourrait aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for p in doc.getElementsByType(odf.text.P)[::-1]:
            i.parentNode.removeChild(i)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 630
    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 630
    Par défaut
    Citation Envoyé par umfred Voir le message
    on pourrait aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for p in doc.getElementsByType(odf.text.P)[::-1]:
            i.parentNode.removeChild(i)
    A partir du moment ou on a une structure hiérarchique, elle peut avoir plusieurs niveaux. Les éléments de type odf.text.P peuvent avoir des parents distincts et appartenir à des listes différentes. Difficile de se contenter de ce que vous proposez même s'il fonctionne sur l'exemple donné par le PO.

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

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut
    Merci à tous les 2 pour votre aide et vos propositions.
    La solution qui consiste à retourner la liste (et donc à supprimer en premier les éléments les plus récents) fonctionne. Dans mon cas, il s'agit de paragraphes et titres créés par mon propre script et qui ont tous le même parent.

    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
    import odf.opendocument
    import odf.text
    doc = odf.opendocument.OpenDocumentText()
     
     
    p1 = odf.text.P(parent=doc.text, text="paragraphe 1",classnames="1")
    p2 = odf.text.P(parent=doc.text, text="paragraphe 2",classnames="2")
    p3 = odf.text.P(parent=doc.text, text="paragraphe 3",classnames="3")
    p4 = odf.text.P(parent=doc.text, text="paragraphe 4",classnames="4")
    p5 = odf.text.P(parent=doc.text, text="paragraphe 5",classnames="5")
    p6 = odf.text.P(parent=doc.text, text="paragraphe 6",classnames="6")
    p7 = odf.text.P(parent=doc.text, text="paragraphe 7",classnames="7")
    p8 = odf.text.P(parent=doc.text, text="paragraphe 8",classnames="8")
     
    liste=doc.getElementsByType(odf.text.P)[::-1]
    print('Nbre de paragraphes : ',len(liste)) # # --> 8
     
    for p in liste:
        p.parentNode.removeChild(p)
     
    #doc.clear_caches()
    liste2=doc.getElementsByType(odf.text.P)
    print('Nbre de paragraphes : ',len(liste2)) # --> 0 et donc MERCI à tous les 2
     
    doc.save(r"C:\Users\chris\Documents\mesScryptPython\fichiers odt\tester_suppression.odt")


    Pour aller plus loin :
    Il existe un dictionnaire doc.__dict__ qui contient plusieurs clés dont 'element_dict'
    ****# 'element_dict' est aussi un dictionnaire et est constitué ainsi ('espace de nom', 'balise') : [element 1,element 2, .... , element 8]

    Si on regarde le contenu de element_dict (en utilisant la liste précédente des 2 façons), on 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
    20
    21
    22
    23
    import odf.opendocument
    import odf.text
    doc = odf.opendocument.OpenDocumentText()
     
     
    p1 = odf.text.P(parent=doc.text, text="paragraphe 1",classnames="1")
    p2 = odf.text.P(parent=doc.text, text="paragraphe 2",classnames="2")
    p3 = odf.text.P(parent=doc.text, text="paragraphe 3",classnames="3")
    p4 = odf.text.P(parent=doc.text, text="paragraphe 4",classnames="4")
    p5 = odf.text.P(parent=doc.text, text="paragraphe 5",classnames="5")
    p6 = odf.text.P(parent=doc.text, text="paragraphe 6",classnames="6")
    p7 = odf.text.P(parent=doc.text, text="paragraphe 7",classnames="7")
    p8 = odf.text.P(parent=doc.text, text="paragraphe 8",classnames="8")
     
    # activer ou désactiver 1 de ces 2 lignes
    liste=doc.getElementsByType(odf.text.P)
    #liste=doc.getElementsByType(odf.text.P)[::-1]
     
    for p in liste:
        p.parentNode.removeChild(p)
        print('len : ', len(doc.__dict__['element_dict'][('urn:oasis:names:tc:opendocument:xmlns:text:1.0', 'p')]))
        print(doc.__dict__['element_dict'][('urn:oasis:names:tc:opendocument:xmlns:text:1.0', 'p')])
        #doc.clear_caches()
    On voit que ce dictionnaire est à jour que lorsque la liste est inversée.
    Je pensais résoudre ce problème avec doc.clear_caches() mais en vain.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 630
    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 630
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    La solution qui consiste à retourner la liste (et donc à supprimer en premier les éléments les plus récents) fonctionne.
    Ce n'est pas une solution mais un bricolage en attendant les retours des développeurs quant à une "vraie" solution.

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

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 489
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    A partir du moment ou on a une structure hiérarchique, elle peut avoir plusieurs niveaux. Les éléments de type odf.text.P peuvent avoir des parents distincts et appartenir à des listes différentes. Difficile de se contenter de ce que vous proposez même s'il fonctionne sur l'exemple donné par le PO.

    - W
    En effet, je réponds uniquement à la problématique du PO dans laquelle on sait que les paragraphes sont les enfants du document (puisqu'on a les créé ainsi) et qu'il n'y a pas d'autres niveaux de hiérarchie

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 630
    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 630
    Par défaut
    Citation Envoyé par umfred Voir le message
    En effet, je réponds uniquement à la problématique du PO dans laquelle on sait que les paragraphes sont les enfants du document (puisqu'on a les créé ainsi) et qu'il n'y a pas d'autres niveaux de hiérarchie
    Dans ce cas, il serait plus simple d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import odf.opendocument
    import odf.text
     
    doc = odf.opendocument.OpenDocumentText() 
    for i in range(1, 5):
        odf.text.P(parent=doc.text, text=f"paragraphe {i}",classnames=f"{i}")
     
    for e in doc.text.childNodes[:]:
        e.parentNode.removeChild(e)
     
    assert not doc.getElementsByType(odf.text.P)
    - 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. Répertoire caché
    Par KUBITUS dans le forum Delphi
    Réponses: 30
    Dernier message: 13/04/2007, 07h19
  2. XMLGram, Import et cache
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 13
    Dernier message: 05/03/2003, 17h09
  3. Qu'est ce que le cache ?
    Par irrou dans le forum Assembleur
    Réponses: 4
    Dernier message: 24/11/2002, 23h28
  4. Ouvrir (fopen) un fichier caché
    Par shef dans le forum C
    Réponses: 2
    Dernier message: 09/09/2002, 09h06
  5. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 11h17

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