Problème code dict
Résolu
William
-
yg_be Messages postés 24281 Statut Contributeur -
yg_be Messages postés 24281 Statut Contributeur -
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.
N'hesitez pas si vous avez des questions
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
A voir également:
- Problème code dict
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
3 réponses
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 :
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)
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.
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.
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 :
Cela fonctionne comme je veux. Par contre si je rentre le premier sous_dict
Je tombe sur l'erreur :
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 !
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 !
le premier sous-dictionnaire est défectueux.
tu peux peut-être le déclarer ainsi:
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.
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.