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 :

Ecrire dans un fichier RTF


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut Ecrire dans un fichier RTF
    Bonjour,
    Dans cette fonction, je ne parviens pas à écrire une donnée dans un fichier .rtf

    Le problème si situe à la fin
    si re.match(r'^nomIdemPrécédent$', line.strip()):
    • line = "nomIdemPrécédent"
    • cleaned_content doit prendre la valeur de nomPersonne
    • cleaned_content est enregistré dans le fichier.rtf à la place de la valeur line en cours



    Ou sont mes erreurs ?
    Alain

    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
    def remplaceXXparNom(targetFile):
     
        precedentNomPersonne = ""
        precedentNom = ""
        nomPersonne = ""
        varianteNomPersonne = ""
        data = []
        premierNom = 0
     
        for para in doc.paragraphs:
            line = para.text.strip()
     
     
            if premierNom == 0 and re.match(r'^[A-ZÉÈ\s]+$', line.strip()): 
                nomPersonne = line
                premierNom = 1                  
     
            else:     
                if re.match(r'^[A-ZÉÈ\s]+$', line.strip()): 
                    # Détecter les noms de personnes en majuscules
                    precedentNomPersonne = nomPersonne
                    nomPersonne = line
     
                else:
                    match = re.match(r'^([A-ZÉÈÀ-ÖØ-Ý\s]+?)[\s(–-]([A-ZÉÈÀ-ÖØ-Ý\s]+)$', line.strip())
     
                    if match:
                        precedentNomPersonne = nomPersonne
                        nomPersonne = match.group(1).strip()
                        varianteNomPersonne = match.group(2).strip()
     
                    elif re.match(r'^nomIdemPrécédent$', line.strip()):
     
                        # Remplacer 'nomIdemPrécédent' par 'nomPersonne'
     
                            cleaned_content = line.replace(r'nomIdemPrécédent', nomPersonne)
     
                        with open(targetFile, 'w', encoding='latin-1') as file:
                            file.write(cleaned_content)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par alainb Voir le message
    Ou sont mes erreurs ?
    Et si vous commenciez par fournir de quoi reproduire le problème?
    Cela vous forcerait à relire votre code (pour le simplifier) et trouver l'erreur par vous même.
    A défaut, vous disposeriez de quoi reproduire et le poster.

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

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et si vous commenciez par fournir de quoi reproduire le problème?
    Cela vous forcerait à relire votre code (pour le simplifier) et trouver l'erreur par vous même.
    A défaut, vous disposeriez de quoi reproduire et le poster.
    - W
    Bonjour wiztricks,
    Ma question est postée en dernier recours, après des heures d'essais infructueux.

    Le fichier source.rtf contient des données généalogiques qui ressemblent à cela
    01 – Nom du hameau
    DUPOND
    Jacques, N*: 15-02-1701, D*: 23-8-1737 (BH) , 36 ans, T*: PIEL Pierre*; MALTESTE Jacques
    M*: 12-2-1733 (V) , VALLE Marie

    DOILE - DOILT
    René, M*: BLANCHE Marie
    1a*: Mathurine, N*: 10-9-1686 (BH) , Pa*: BOUDARD Jan
    Ma*: MÉTAYER Mathurine, Haute-Berdaye

    nomIdemPrécédent
    Jan, tixier, D*: 12-2-1686 (BH) , T*: MÉTAYER Jacques, beau-père
    M*: 21-4-1682 (V) , GRINDART Suzanne (V)

    DURAND
    Alain, N*: 15-12-1721, D*: 2-5-1787 (BH), T*: PLATEL Paul
    M*: 8-6-1723 (V) , VILLER Yvette
    Chaque paragraphe débute par le nom d'une personne (en gras). Le sujet posé porte précisément sur cette ligne. Quand son contenu égal "nomIdemPrécédent" alors la valeur doit être remplacée par le nom qui a été lu dans le paragraphe précédent. Dans l'exemple du fichier "nomIdemPrécédent" devient "DOILE".
    Remarque: la variante du nom DOILT n'est pas considérée.

    La fonction est appelée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplaceXparNom(targetFile)
    "targetFile" est la chaine du chemin pour accéder au fichier source.rtf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sourceDir = r"C:\Users\et\eclipse-workspace\Genealogie\source"
    fileName = "source.docx"
    targetFile = os.path.join(sourceDir, fileName.replace('.docx', '.rtf'))
    J'espère que mes informations sont compréhensibles.
    Alain

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par alainb Voir le message
    J'espère que mes informations sont compréhensibles.
    C'est écrit en français pas de soucis!
    Mais je ne pense pas qu'on puisse reproduire plus facilement quoi que ce soit!

    "reproduire" signifie recopier quelques lignes de codes avec un minimum de données pour constater les mêmes résultats que vous lorsqu'on l'exécute chez soi.
    Si on doit éditer le code, on n'est pas sur de reproduire le même problème (et donc on perd son temps).

    Quand je ne comprend plus ce que fait un code que j'ai écrit, je le fous à la poubelle... Et je recommence en essayant de décomposer autrement les opérations pour essayer de maîtriser ce qu'il s'y passe. C'est comme ça qu'on progresse.

    *edit*
    Par exemple, vous racontez "chaque paragraphe débute par le nom d'une personne (en gras). Le sujet posé porte précisément sur cette ligne...".

    On devrait voir une fonction recevant un objet à 2 dimensions (paragraphes et lignes) sur lequel le corps (de la fonction) effectue le travail attendu et retourne l'objet modifié.
    Charge à l'appelant de récupérer le résultat pour l'écrire où il veut.
    Dans votre cas, vous passez le nom de fichier à la fonction et l'objet sur lequel elle travaille est une variable globale.

    Puis dans le corps de la fonction, on devrait travailler sur la première ligne... pas sur ce qui ressemble à tout le paragraphe.
    et puisque vous faites de la mise au point, virez tout ce qui ne sert à rien!
    Illustration.
    Je prends un objet a 2 dimensions comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P = [ [1, 2, 3], ['*', 5, 6], [7, 8, 9], [10, 11, 12], ]
    Et je dis que lorsque je rencontre un tuple/paragraphe dont le premier item est '*' alors je le remplace par le premier item du paragraphe précédent.
    Ce qui donne le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def foo(p):
        v = None
        for u in p:
            if u[0] != '*':
                v = u[0]
            else:
                assert v, 'fatal, previous value undefined'
                u[0] = v
        return p
     
    P = [ [1, 2, 3], ['*', 5, 6], [7, 8, 9], [10, 11, 12], ]
    print(foo(P))
    dont la sortie sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[1, 2, 3], [1, 5, 6], [7, 8, 9], [10, 11, 12]]
    Ca fait un code de 9 lignes, le votre en fait 40!
    Non seulement il ne marche pas mais vous ne comprenez plus ce qu'il fait vu la distance entre l'intention de départ et sa réalisation...

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

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Non seulement il ne marche pas mais vous ne comprenez plus ce qu'il fait !
    Bonjour wiztricks,
    Après avoir créé la fonction pour détecter les paragraphes du texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def create_2d_object(text):    
        result = []
        for paragraph in text.split('\n\n'):
            lines = paragraph.split('\n')
            first_line = lines[0].strip()
            rest_of_paragraph = ' '.join(line.strip() for line in lines[1:])
            result.append([first_line, rest_of_paragraph])
        return result
    J'ai utilisé ta fonction "avec succès" pour remplacer le nom s'il est égal à "nomIdemPrécédent". Le script est plus lisible.

    Par contre, je ne sais pas comment écrire la donnée modifiée dans le fichier.txt
    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
      def nip(result):
            with open(textFile, 'r') as file:
                text_content = file.read()
     
            actuel = None
            for nom in result:
                if nom[0] != 'nomIdemPrécédent':
                    actuel = nom[0]
                    cleaned_content = re.sub(r'nomIdemPrécédent', actuel , text_content)
                    write_text_file(cleaned_content)  
     
                else:
                    assert actuel, 'erreur: valeur précédente indéfinie'
                    nom[0] = actuel
            return result
    Je profite de l'occasion pour vous souhaiter une bonne année et une bonne santé !
    Alain

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par alainb Voir le message
    Par contre, je ne sais pas comment écrire la donnée modifiée dans le fichier.txt
    Vous montrez les bouts de code que vous voulez sans montrer comment ils sont assemblées ni fournir de quoi reproduire ce que vous constatez...

    Du coup, on imagine que le fichier lu est expédié à create_2d_object(text) qui retourne la liste result qui sera mise à jour par nip(result) qui retournera ce qui devra être écrit dans le fichier à je ne sais quoi...

    Outre qu'on ne comprend pas ce que viennent faire les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            with open(textFile, 'r') as file:
                text_content = file.read()
    Dans cette fonction, nulle part fous essayez d'écrire quoi que ce soit dans un fichier...

    Ce qui ne permet pas de savoir ce sur quoi vous butez (sachant que vous avez certainement travaillé sur le chapitre qui parle des fichiers de votre tuto favori...)

    Citation Envoyé par alainb Voir le message
    Je profite de l'occasion pour vous souhaiter une bonne année et une bonne santé !
    Merci! meilleurs vœux et bonne santé à vous aussi (et surtout la santé comme on insiste dans mon coin).

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

Discussions similaires

  1. Ecrire dans un fichier RTF avec CStdioFile
    Par Kemanke dans le forum MFC
    Réponses: 8
    Dernier message: 04/12/2007, 12h28
  2. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 21h03
  3. [JAR] Comment écrire dans un fichier properties dans un jar
    Par Alec6 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 05/10/2004, 16h16
  4. inserer une image BMP dans un fichier rtf
    Par Alice9 dans le forum MFC
    Réponses: 17
    Dernier message: 06/07/2004, 11h31
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 16h44

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