Problème code dict [Résolu]

Signaler
-
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
-
Bonjour,

Je vous explique mon problème, j'ai déclaré un dict, qui comporte plusieurs sous-dict. (C'est un code que j'avais fait il y a longtemps et j'avoue que j'ai du mal à me replonger de dans et peut être qu'un avis extérieur pourrait m'aider).

Le code ci-dessous permet de modifier un texte présent dans un dictionnaire (exemple : "Bonjour" devient "Bonsoir), le souci est que mon code fonctionnait suivant un sous-dict précisé et pas sur le dict complet.

Ma demande serait de pouvoir executer mon code sur le dictionnaire complet.


#je n'ai volontairement pas placé mon dictionnaire celui-ci étant excessivement long et pas forcément utile

def find_END(line):
    if re.search(r'\bFIN\b', line):
        return True
    else:
        return False

def replacer_factory1(dictionary):
    def replacing(match):
        if len(dictionary) > 0:
            word = match.group()
            exchange = dictionary.get(word, word)
            return exchange
        else:
            return ""
    return replacing

def replacing1(text, dict):
    regex_patt_list = r'\b(?:' + '|'.join(dict) + r')\b'
    replacer = replacer_factory1(dict)
    return re.sub(regex_patt_list, replacer, text)



def folder(input,output):
    with open(sys.argv[1] + input) as fin:
        with open(sys.argv[1] + output, 'w') as fout:
            key = 0
            sous_dict = dict["***US N4"]
            cache_mem = []
            for line in fin:
                cache_mem.append(line)
                if find_END(line):
                    #print(cache_mem)
                    for x in cache_mem:
                        if x.strip() in dict.keys():
                            key = x.strip()
                            sous_dict = dict[key]
                        fout.write(replacing1(x,sous_dict))
                    cache_mem = []


print(sys.argv[0])
result = os.listdir(sys.argv[1])
for x in result:
    folder(x, x + "V")
print(result)


N'hesitez pas si vous avez des questions
Configuration: Windows / Edge 88.0.705.50

3 réponses

Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867
bonjour,
peux-tu partager un code complet que nous pouvons tester?
Bonjour et merci pour votre réponse.

Pour executer le code que voici, j'insérai mon code dans un fichier nommé par exemple "conversion.py" puis dans un dossier enfant "toto" je créais un fichier nommé a.txt

Ensuite en tapant la commande depuis le dossier ou se trouve mon code : "python conversion.py toto/"
J'avais les modifications du sous_dict indiquées.

Code complet :

import re
import os
import sys

dict = {'Dict1': {"Pomme": "Poire"},
        'Dict2': {"Banane": "Tomate"},
        'Dict3': {"fleur": "Arbre"},}

def find_END(line):
    if re.search(r'\bFIN\b', line):
        return True
    else:
        return False

def replacer_factory1(dictionary):
    def replacing(match):
        if len(dictionary) > 0:
            word = match.group()
            exchange = dictionary.get(word, word)
            return exchange
        else:
            return ""
    return replacing

def replacing1(text, dict):
    regex_patt_list = r'\b(?:' + '|'.join(dict) + r')\b'
    replacer = replacer_factory1(dict)
    return re.sub(regex_patt_list, replacer, text)



def folder(input,output):
    with open(sys.argv[1] + input) as fin:
        with open(sys.argv[1] + output, 'w') as fout:
            key = 0
            sous_dict = dict["Dict3"]
            cache_mem = []
            for line in fin:
                cache_mem.append(line)
                if find_END(line):
                    #print(cache_mem)
                    for x in cache_mem:
                        if x.strip() in dict.keys():
                            key = x.strip()
                            sous_dict = dict[key]
                        fout.write(replacing1(x,sous_dict))
                    cache_mem = []

print(sys.argv[0])
result = os.listdir(sys.argv[1])
for x in result:
    folder(x, x + "V")
print(result)
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 > William
voilà, le programme fonctionne, il ne fait rien.
que penses-tu qu'il fasse?
>
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021

J'aimerais qu'il puisse modifier tous les mots indiqués dans mon dictionnaire, tout simplement.
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 > William
tu as écrit que le code existant permet de modifier un texte présent dans un dictionnaire: comment puis-je observer cela?
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 >
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021

as-tu écrit ce programme, le comprends-tu?

à quoi sert
if x.strip() in dict.keys()
?

pourquoi as-tu trois dictionaries séparés? pourquoi veux-tu utiliser les trois? pourquoi ne pas en faire un seul?
>
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021

Oui, oui en faite pour etre vraiment explicite, le code fonctionnait sur un très très gros fichier texte avec différente partie.
Et dans certaines de ces parties il pouvait y avoir des mots qui n'avaient pas le même nom.
Exemple dans une partie "dict1" : Pomme devient Poire alors que pour une autre partie "dict2" : Pomme devient Fraise.

Je ne sais pas si je suis assez explicite, mais c'est pour cela que j'avais fait ce code et c'est à ça que servait la ligne x.strip()
Après si vous avez une autre option à me proposer je suis preneur.

L'idée étant que chaque partie du texte est précédé d'un mot (dans mon exemple dict quelque chose) et pour chaque partie différente on applique un changement de mot.

Pour faire simple on applique le changement de mot du dictionnaire en fonction du nom du sous dictionnaire.
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 > William
tout le dictionnaire, donc sans tenir compte des noms des parties?
>
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021

Malheureusement si, je ne sais pas si le meilleur choix étant de faire plusieurs dictionnaires séparés et donc de tous les appeler pour que tous les changements soient pris en compte.
Ou si en appelant le dictionnaire complet, c'est possible d'obtenir le même résultat
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 > William
je ne comprends pas: je pense que le code utilise, pour chaque partie, le sous-dictionnaire correspondant à cette partie.
donc que tous les sous-dictionnaires sont utilisés.
>
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021

Il faut que je fasse plus de test de mon coté pour vérifier que chaque sous_dictionnaire fonctionne.

Un très très grand merci en tout cas pour ton temps, je n'ai pas l'habitude d'utiliser les forums, mais me trouver fasse à une personne qui prend le temps de comprendre un problème, donne vraiment envie d'apprendre et d'aider en retour.

William
Messages postés
16017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juin 2021
867 > William
ok, bonne suite!
pourras-tu, après avoir fait tes tests, su tu n'as pas d'autre question, marquer la discussion comme résolue?