Problème code dict

Résolu/Fermé
William - 14 avril 2021 à 16:09
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 - 15 avril 2021 à 17:22
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

yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272
14 avril 2021 à 16:12
bonjour,
peux-tu partager un code complet que nous pouvons tester?
1
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)
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272
14 avril 2021 à 16:29
que contient le fichier a.txt?
0
William > yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022
14 avril 2021 à 16:55
Un texte classique avec des mots
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272 > William
14 avril 2021 à 17:11
voilà, le programme fonctionne, il ne fait rien.
que penses-tu qu'il fasse?
0
William > yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022
14 avril 2021 à 17:16
J'aimerais qu'il puisse modifier tous les mots indiqués dans mon dictionnaire, tout simplement.
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272 > William
14 avril 2021 à 17:20
tu as écrit que le code existant permet de modifier un texte présent dans un dictionnaire: comment puis-je observer cela?
0
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.
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272
14 avril 2021 à 18:33
tu n'as pas encore expliqué précisément ce que faisait le programme, et ce qu'il devrait faire de différent.
partage un exemple de contenu de fichier texte, et un groupe de dictionnaires correspondants.
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272 > yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022
14 avril 2021 à 18:40
d'après moi, le programme fait exactement ce que tu expliques.
partage des données pour un cas où le programme ne fonctionne pas.
0
William > yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022
Modifié le 14 avril 2021 à 21:48
Bonsoir, excuse moi pour mon délais de réponse.
Tu trouveras ci-joint le fichier complet : https://www.cjoint.com/c/KDotKZBgiSJ

La ou le code ne fonctionne pas comme je voudrais c'est pour la chose suivante.
Si je rentre un sous_dict (exemple "C" pour la ligne 253 :
sous_dict = dict["C"]


Cela fonctionne comme je veux. Par contre si je rentre le premier sous_dict
sous_dict = dict["***PROTECTION REACTEUR"]


Je tombe sur l'erreur :
Traceback (most recent call last):
  File "Manta-v3.8.0.py", line 270, in <module>
    folder(x, x + "V")
  File "yg_be.py", line 263, in folder
    fout.write(replacing1(x,sous_dict))
  File "yg_be.py", line 245, in replacing1
    return re.sub(regex_patt_list, replacer, text)
  File "/usr/lib64/python2.6/re.py", line 151, in sub
    return _compile(pattern, 0).sub(repl, string, count)
  File "/usr/lib64/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat


La où mon code pose aussi problème c'est que j'aimerais qu'il effectue les modifications sur mes fichiers pour toutes les données de mon dictionnaire et non pour un sous_dict en particulier.

Merci encore pour ton temps et ton aide !
0
yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022 1 272 > William
14 avril 2021 à 22:48
le premier sous-dictionnaire est défectueux.
tu peux peut-être le déclarer ainsi:
dict = {'***PROTECTION REACTEUR': {"\*\*\*PROTECTION REACTEUR": "***CONTROLE COMMANDE DEBUT"},


je pense que le code choisit, pour chaque partie du fichier, quel sous-dictionnaire utiliser, comme tu as expliqué en #10.
n'est-ce pas ce que tu souhaites?
si c'est ce que tu souhaites, donne un exemple de fichier texte pour lequel cela ne fonctionne pas.
si ce n'est pas ce que tu souhaites, explique ce que tu souhaites. de préférence avec un exemple précis.
0
William > yg_be Messages postés 20759 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 décembre 2022
15 avril 2021 à 08:30
L'idée au lieu de boucler sur un seul sous_dict, serait se boucler sur tous le dictionnaire.
Avec une boucle du style :
for sous_dict in dict.values()


Mais je n'ai plus trop de connaissances en Python, donc je bloque vraiment pour l'élaboration de cette boucle..
0