Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice python sur les fichiers

27 mars 2020 à 15:30:43

Bonjour j'ai besoin d'aide pour cette exercice python svp 

Ecrire une fonction nouveaux_heros dont le but consiste à remplacer les héros d'une histoire. Il y aura deux paramètres:

  • le premier sera une chaîne de caractères précisant le nom du fichier contenant l'histoire initiale ;
  • le deuxième sera une chaîne de caractères précisant le nom du fichier dans lequel sera sauvegardée l'histoire modifiée comme précisé ci-dessous

Dans l'histoire initiale, présente dans le fichier dont le nom est donné en premier argument, trois protagonistes interviennent : Pierre, Paul et Jacqueline.
La fonction devra remplacer ces trois héros par, respectivement, Paul, Tom et Mathilde.
Le texte ainsi modifié sera alors stocké dans le fichier dont le nom est donné en deuxième argument.



  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2020 à 17:35:21

C'est vraiment bateau comme exercice, il faut que tu regardes du côté des f-strings en python, ça fait tout le boulot...

As-tu déjà fait un code ? Si oui présentes-le, sinon, travaille déjà sur la ligne avant de travailler sur les fichiers.

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

27 mars 2020 à 18:04:35

oui j'ai déjà commencer quelque chose mais je suis bloqué 

# -*- coding: utf-8 -*-
def nouveaux_heros(a,b):
    fichier=open("histoire_1.txt")
    text= fichier.read()



  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2020 à 18:09:11

Wep, le fichier on s'en fout, c'est le traitement de la ligne qui est important, il faut bosser la dessus en te servant des f-strings python. Tu as tes mots clés pour faire une recherche, bon courage.
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

27 mars 2020 à 22:37:11

fred1599 a écrit:

Wep, le fichier on s'en fout, c'est le traitement de la ligne qui est important, il faut bosser la dessus en te servant des f-strings python. Tu as tes mots clés pour faire une recherche, bon courage.


j'ai compris a quoi sert f-string mais moi je ne peut pas mettre des acolades pour changer les noms est ce que vous pouvez juste me donner le début pour m'éclaire svp
  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2020 à 22:46:54

d'autant que c'est pas les f-strings le problème c'est juste la méthode .replace():

print("truc bidule".replace('bidule','machin'))

> attention, elle te renvoie une nouvelle chaine, elle ne modifie pas l'ancienne

-
Edité par Coliculus 27 mars 2020 à 22:48:00

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2020 à 8:57:55

Moi j'ai pris ça pour un template,

TEMPLATE = "Si {fils} est le fils de {pere}, et si {pere} est le frère de {tante}, qui est {fils} pour {tante} ?"

texte = "Si Pierre est le fils de Paul, et si Paul est le frère de Jacqueline, qui est Pierre pour Jacqueline ?"
texte = TEMPLATE.format(fils="Paul", pere="Tom", tante="Mathilde")
print(texte)



  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

28 mars 2020 à 10:53:53

oui mais moi dans mon texte c'est directement comme ça 

Si la soeur de Pierre est la fille de Jacqueline et Paul qui est Paul pour Pierre ?

je n'ai pas les accolades donc du je ne peut pas donner de valeur fils pere tante ?

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2020 à 11:24:59

TEMPLATE = "Si {0} est le fils de {1}, et si {1} est le frère de {2}, qui est {0} pour {2} ?"

texte = "Si Pierre est le fils de Paul, et si Paul est le frère de Jacqueline, qui est Pierre pour Jacqueline ?"
texte = TEMPLATE.format("Paul", "Tom", "Mathilde")
print(texte)

T'as pas à toucher à la constante TEMPLATE, je vois pas le problème, je te propose une solution sans mettre les noms des attributs à la rigueur.
Le principe est d'écraser le texte précédent, par un autre texte construit sur le même template.
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

28 mars 2020 à 13:49:04

oui mais moi dans mon texte c'est directement comme ça 

Si la soeur de Pierre est la fille de Jacqueline et Paul qui est Paul pour Pierre ?

je n'ai pas les accolades donc du je ne peut pas donner de valeur fils pere tante ?

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2020 à 14:36:16

Et comment tu remplaces les 3 héros alors ?
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

28 mars 2020 à 17:46:04

Non je veux dire comment il envoi cette information ? replace n'est pas la seule solution, c'est certains...

EDIT: D'ailleurs pour moi l'énoncé est loin d'être clair, ça manque de précision sur les étapes d'exécution de la tâche.

-
Edité par fred1599 28 mars 2020 à 17:51:44

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

28 mars 2020 à 22:43:56

j'ai essayer de faire comme ca deja sa m'aidera un peu plus donc la je dois juste remplacer les valeurs entre guillemets par des autres noms avec replace ?

Si la soeur de {Pierre} est la fille de {Jacqueline} et {Paul} qui est {Paul} pour {Pierre} ?

Si la soeur de {0} est la fille de {1} et {2} qui est {2} pour {0} ?

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2020 à 23:21:39

Non la t'as mélangé les 2 ... on reprend depuis le début:

t'as ton texte qui est comme ca au début je ne me trompe ? > Si la soeur de Pierre est la fille de Jacqueline et Paul qui est Paul pour Pierre

soit tu utilise que relace et du coup il fait faire attentien à l'ordre pour pas remplace tes "Paul" nouvellement créés:

tranformation = {
'Paul': 'Tom',
'Pierre': 'Paul',
'Jacqueline': 'Mathlide'
}

for ancien, nouveau in tranformation.items():
    texte = texte.replace(ancien, nouveau)

soit tu fait ce qu'as l'air de dire fred1599 (qui nécessite quand même replace mais où tu te fiche de l'ordre puisqu'il n'y as plus de redondance:

preparation = {
'Paul': '{fils}',
'Pierre': '{pere}',
'Jacqueline': '{tante}'
}

for nom, statut_familial in preparation.items():
    texte = texte.replace(nom, statut_familial)

texte = texte.format(fils='Paul', pere='Tom', tante='Mathilde') # une fois que tout est remplacé on formate

ou si tu est en python3 l'ordre des dictionnaires est conservé:

transformation = {
'Paul': 'Tom',
'Pierre': 'Paul',
'Jacqueline': 'Mathilde'
}

for i, nom in enumerate(transformation.keys()):
    texte = texte.replace(nom, f"\{{i}\}")

texte = texte.format(*transformation.values()) # pour formatter sans s'embeter avec les noms si il y en plein par ex ...

Je vois pas trop comment fred comptait faire sans replace, j'attend de voir.


-
Edité par Coliculus 28 mars 2020 à 23:22:48

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 8:57:23

je préfère celle sur python 3 merci beaucoup mais je ne voit pas comment sa peut marcher vu qu'il n'y a pas de variable nom dans ton code ? et dans transformation keys on doit bien rien mettre vu qu'on la fait plus haut avec la transformation des noms?
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 9:29:16

Pour moi cela fait le taf,

TEMPLATE = "Si {0} est le fils de {1}, et si {1} est le frère de {2}, qui est {0} pour {2} ?"


def nouveaux_heros(f1, f2):
    noms = ["Paul", "Tom", "Mathilde"]
    with open(f2, 'w') as f:
        ligne = TEMPLATE.format(*noms)
        f.write(ligne)



On voit que f1, qui représente le 1er fichier ne sert à rien, et qu'on peut écrire dans le nouveau fichier f2 les nouveaux noms écrit en dur dans la fonction.

C'est pour ça que je dis que cet exercice ne tient pas la route, voir si on veut lui donner un peu d'importance, très mal exprimé dans l'exécution des tâches.

-
Edité par fred1599 29 mars 2020 à 10:20:54

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

29 mars 2020 à 9:54:22

oui mais du coup dans mon fichier texte j'ai directement des noms écrits je n'ai pas des accolades c'est pour ca c'est encore plus compliqué mais du coup ce que ta fait sa correspond pas a ce qui est attendu mais merci de m'avoir aidé en tout cas
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 10:20:02

fred1599 a écrit:

On voit que f1, qui représente le 1er fichier ne sert à rien, et qu'on peut écrire dans le nouveau fichier f2 les nouveaux noms écrit en dur dans la fonction.

 Le truc c'est que c'est pas toi qui decide si le fichier 1 sert ou pas puisque c'est ca l'exercice ! La t'as juste copié collé le contenu du fichier dans ton code , réécrit le truc comme ca te chantais alors que t'aurais directement pu mettre la bonne réponse puis tu sauvegarde. Il t'as dit je ne sais combien de fois que lui il a un fichier (imposé par l'exercice), et il veut remplacer des mots par d'autres.

MarwanBeni a écrit:

je préfère celle sur python 3 merci beaucoup mais je ne voit pas comment sa peut marcher vu qu'il n'y a pas de variable nom dans ton code ? et dans transformation keys on doit bien rien mettre vu qu'on la fait plus haut avec la transformation des noms?

 Non en fait c'est la boucle for qui le fait, si tu l'as pas encore vu: la boucle for génère une variable pour chaque élément dans l'ordre dans laquelle elle les trouve, il faut juste lui mettre le nom de cette dite variable, "nom" dans le cas présent.

transformation.keys() c'est une méthode mais des dictionnaires, comme l'est .replace() mais pour les strings. Elle renvoie les clés du dictionnaire (les valeurs de gauche) dans l'ordre. Du coup for peut les utiliser une à une sous le nom qu'on lui a donné: "nom".

enumerate permet en plus de compter à combien d'élément on est rendu dans for. Je l'utilise du coup pour faire ce que fred disais > je remplace les noms par des "{numero_de_la_clé}" comme ca à la fin quand j'utilise format ils sont tous remplacés par ce qu'il faut.

Si t'as encore vu rien de tout ça je pense que la réponse qu'il attendaient doit ressembler à ça:

texte = texte.replace('Paul', 'Tom').replace('Pierre','Paul').replace('Jacqueline','Mathilde')

 Après pour la lecture des fichier on préfère écrire comme suit habituellement:

with open('fichier.txt','r') as mon_fichier:
    contenu = mon_fichier.read()
# comme ca quand tu sort du bloc de with le fichier sera
# automatiquement fermé (evite les oublis)



-
Edité par Coliculus 29 mars 2020 à 11:07:47

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 10:26:20

.

-
Edité par fred1599 29 mars 2020 à 10:37:27

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

29 mars 2020 à 11:45:39

Une solution évitant replace :

def subs(text, names, alt):
    return alt[0].join(subs(piece, names[1:], alt[1:]) for piece in text.split(names[0])) if names else text


def test():
    text = ("Si Pierre est le fils de Paul, et si Paul est le frère"
           " de Jacqueline, qui est Pierre pour Jacqueline ?")
    names = ["Pierre", "Paul", "Jacqueline"]
    alt = ["Paul", "Tom", "Mathilde"]
    s = subs(text, names, alt)
    print(text)
    print(s)



Si Pierre est le fils de Paul, et si Paul est le frère de Jacqueline, qui est Pierre pour Jacqueline ?                                                                                            
Si Paul est le fils de Tom, et si Tom est le frère de Mathilde, qui est Paul pour Mathilde ? 

Ça paraît compliqué mais en fait l'idée est simple :

  • vous découpez le texte (avec split) par le premier prénom, 
  • récursivement, vous substituez dans les différents morceaux les autres prénoms
  • vous recollez avec le prénom alternatif au premier en utilisant join

EDIT

Merci à MarwanBeni et à tous les autres pour cette discussion, ça me fait un nouvel exercice de récursivité :)

-
Edité par PascalOrtiz 29 mars 2020 à 12:14:06

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 14:29:09

donc ça donnerait ça alors et merci de vos explications 

# -*- coding: utf-8 -*-
def nouveau_heros(a,b):
    with open('histoire_1.txt','r') as mon_fichier:
        contenu = mon_fichier.read()
        transformation = {'Paul': 'Tom','Pierre': 'Paul','Jacqueline': 'Mathilde'}
        for i, nom in enumerate(transformation.keys()):
            texte = texte.replace(nom, f"\{{i}\}")
texte = texte.format(*transformation.values())



-
Edité par MarwanBeni 29 mars 2020 à 14:55:25

  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 15:58:30

Coliculus a écrit:

Si t'as encore vu rien de tout ça je pense que la réponse qu'il attendaient doit ressembler à ça:

texte = texte.replace('Paul', 'Tom').replace('Pierre','Paul').replace('Jacqueline','Mathilde')
C'est ce que je dirais également.
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2020 à 16:14:51

# -*- coding: utf-8 -*-
def nouveau_heros(a,b):
    with open('histoire_1.txt','r') as mon_fichier:
        contenu = mon_fichier.read()
        transformation = {'Paul': 'Tom','Pierre': 'Paul','Jacqueline': 'Mathilde'}
        for i, nom in enumerate(transformation.keys():
            texte = texte.replace(nom, f"\{{i}\}")
texte = texte.format(*transformation.values())
le problème la c'est que ma variable et b ne sont pas défini je remplace b par texte et a faut que je fasse à nouveau la lecture du fichier en nommant la variable a aidez moi svp

-
Edité par MarwanBeni 29 mars 2020 à 19:06:40

  • Partager sur Facebook
  • Partager sur Twitter