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

Exercices Python Discussion :

aide exo 9.4 d'apprendre python 3 de Gerard Swinnen


Sujet :

Exercices Python

  1. #1
    Futur Membre du Club
    aide exo 9.4 d'apprendre python 3 de Gerard Swinnen
    Bonjour

    je suis bolqué sur l'exercice 9.4 du livre Python de gérard Swinnen. Le code doit lire un texte et le recopier en triplant les espaces.
    Le code que j'ai trouvé permet de lire le texte, triple les espaces mais ne le recopie pas.
    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
    #9.4 tripler l'espace entre les mots
     
    #triplement des espaces dans un fichier texte
    from os import chdir
    chdir("/home/loic/Documents/python/manipulation fichier")
     
    def triplerEspaces(ch):
        "fonction qui triple les espaces"
        i, nouv=0,""
        while i < len(ch):
            if ch[i]==" ":
                nouv=nouv+"   "
            else:
                nouv=nouv+ch[i]
            i=i+1
        return nouv
     
    NomF=input("Nom du fichier: ")
    fichier= open(NomF,"w+")
    lignes=fichier.readlines()
    fichier.close
     
    n=0
    while n<len(lignes):
        lignes[n] = triplerEspaces(lignes[n])
        n=n+1
     
    fichier=open(NomF,"a")
    #fichier.seek(5)
    fichier.writelines(lignes)
    fichier.close
     
    print (lignes)


    pourriez vous m'aider?

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par loicsu33 Voir le message
    Le code que j'ai trouvé permet de lire le texte, triple les espaces mais ne le recopie pas.
    Pourquoi ne pas le comparer avec le code donné en solution? Et essayer de comprendre par vous même où est l'erreur...

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

  3. #3
    Futur Membre du Club
    bonjour W

    C'est le code du corrigé. Je ne sais pas si c'est un bug du logiciel que j'utilise ou si c'est le code... Je suis un peu perdu.
    Je suis sur ubuntu et j'utilise IDLE.

  4. #4
    Expert éminent sénior
    Salut,

    Citation Envoyé par loicsu33 Voir le message
    C'est le code du corrigé.
    Dans le cours Python disponible ici, le corrigé de l'exercice est:
    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
    # Triplement des espaces dans un fichier texte.
    # Ce script montre également comment modifier le contenu d'un fichier
    # en le transférant d'abord tout entier dans une liste, puis en
    # ré-enregistrant celle-ci après modifications
     
    def triplerEspaces(ch):
      "fonction qui triple les espaces entre mots dans la chaîne ch"
      i, nouv = 0, ""
      while i < len(ch):
          if ch[i] == " ":
          nouv = nouv + "	"
          else:
          nouv = nouv + ch[i]
          i = i +1	  
      return nouv
     
    NomF = input("Nom du fichier : ")
    fichier = open(NomF, 'r+')	  # 'r+' = mode read/write
    lignes = fichier.readlines()	    # lire toutes les lignes
     
    n=0
    while n < len(lignes):
      lignes[n] = triplerEspaces(lignes[n])
      n =n+1
     
    fichier.seek(0) 	    # retour au début du fichier
    fichier.writelines(lignes)	  # réenregistrement
    fichier.close()

    et vous pouvez constater vous même que la partie traitement de fichier est bien différente.

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

  5. #5
    Futur Membre du Club
    bonjour W

    Je viens de tester le code corrigé de l'exercice 9.5 et je me retrouve avec le même problème d'écriture dans un fichier.
    le problème est de récupérer des nombres dans un fichier, de les convertir en entier et de les inscrire dans un nouveau fichier.
    J'arrive à avoir la lecture, la conversion, la création du nouveau fichier mais pas l'écriture... j'ai vérifié les droits du fichier et j'ai la permission en écriture.
    ci dessous le code corrigé de l'exercice 9.5

    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
    #mise en forme de données numériques
    #le fichier traité est un fichier texte dont chaque ligne contient un nombre
    #réel (sans exposant et encodé sous la forme de caractères)
     
    def valArrondie(ch):
        "représentation de la valeur arrondie du nombre présenté dans la chaine ch"
        f=float(ch)     #conversion de la chaine en un nombre réel
        e=int(f+0.5)    #conversion en entier (on ajoute d'abord 0.5 au réel
                        #pour l'arrondir correctement)
        return str(e)   #reconversion en chaine de caractères
     
    fiSource=input("Nom du fichier à traiter: ")
    fiDest=input("Nom du fichier destinataire: ")
    fs = open(fiSource,'r')
    fd = open(fiDest, 'w')
     
    while 1:
        ligne = fs.readline()     #lecture d'une ligne de fichier
        if ligne == "" or ligne == "\n":
            break
        ligne =valArrondie(ligne)
        print(ligne)
        fd.write(ligne + "\n")
     
     
    fs.close
    fd.close

  6. #6
    Futur Membre du Club
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Dans le cours disponible ici, le corrigé de l'exercice est:
    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
    # Triplement des espaces dans un fichier texte.
    # Ce script montre également comment modifier le contenu d'un fichier
    # en le transférant d'abord tout entier dans une liste, puis en
    # ré-enregistrant celle-ci après modifications
     
    def triplerEspaces(ch):
      "fonction qui triple les espaces entre mots dans la chaîne ch"
      i, nouv = 0, ""
      while i < len(ch):
          if ch[i] == " ":
          nouv = nouv + "	"
          else:
          nouv = nouv + ch[i]
          i = i +1	  
      return nouv
     
    NomF = input("Nom du fichier : ")
    fichier = open(NomF, 'r+')	  # 'r+' = mode read/write
    lignes = fichier.readlines()	    # lire toutes les lignes
     
    n=0
    while n < len(lignes):
      lignes[n] = triplerEspaces(lignes[n])
      n =n+1
     
    fichier.seek(0) 	    # retour au début du fichier
    fichier.writelines(lignes)	  # réenregistrement
    fichier.close()

    et vous pouvez constater vous même que la partie traitement de fichier est bien différente.

    - W
    effectivement vous avez raison. Je débute sur le forum et je n'ai pas vu que j'avais mis une version différente du corrigé pour essayer de trouver pourquoi la version du corrigé n'écrivait pas dans le fichier. désolé pour cette erreur. Il m'arrive le même problème sur l'exercice suivant comme noté dans mon autre message.

  7. #7
    Expert éminent sénior
    Citation Envoyé par loicsu33 Voir le message
    Il m'arrive le même problème sur l'exercice suivant comme noté dans mon autre message.
    Et bien assurez-vous plutôt 3 fois qu'une que vous avez recopié la solution proprement!

    Citation Envoyé par loicsu33 Voir le message
    Je débute sur le forum et je n'ai pas vu que j'avais mis une version différente du corrigé
    C'est un forum de développeurs Python: si vous avez des soucis pour faire un exercice, on voudra bien essayer de vous expliquer deux/trois trucs pour y arriver.
    Pour ce qui est d'apprendre à recopier le texte d'une fenêtre à celle de l'éditeur de texte, c'est pas le bon forum.

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

  8. #8
    Futur Membre du Club
    J'ai trouvé mon erreur.

    Il manquait les parenthèses à la fin de la méthode .close()

    Merci pour votre temps.

  9. #9
    Expert éminent sénior
    Citation Envoyé par loicsu33 Voir le message
    comme a dit wiztricks qui apporte des bonnes réponses quand il ne flingue pas: il faut parfois sortir du code...
    Relisez les 2 dernières lignes du code que vous avez posté:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    fs.close
    fd.close

    • Vous faîtes un exercice du chapitre 9 en ignorant encore la différence entre fonction et appel d'une fonction,
    • Relisez le corrigé: les parenthèses sont bien là.


    Merci pour cette réponse bienveillante qui ne fait pas avancer mon problème. C'est cool de se sentir épaulé.
    La première des choses à faire lorsqu'on recopie et que çà ne fonctionne pas est de s'assurer qu'on n'a rien oublié au passage. Il est vrai qu'il peut être galère de recopier du code qu'on ne comprend pas. Et on fait des erreurs dans la recopie que nos yeux seront incapables de détecter: c'est juste du charabia!

    A vous de trouver comment apprendre pour que ce soit autre chose que du charabia (et pour çà, il faut plus que recopier les solutions d'exercice).

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

  10. #10
    Futur Membre du Club
    Vous avez raison. Mais un œil extérieur est utile.

    Je vous remercie pour votre aide.

    N'avez vous jamais buté sur un problème qui énerve beaucoup qu'un collègue étant extérieur à votre situation ne résolve en 2 minutes?
    Je me suis énervé sur ce problème pendant 2 mois avant de prendre contact avec un forum sans voir que j'avais la solution sous les yeux!

    C'est en me servant de votre message avec la solution que j'ai vu mon erreur qui était évidente!

    Je reprends mon bouquin et j'avance. J'ai souvent appris par l'erreur.

    Encore merci!

  11. #11
    Futur Membre du Club
    Bonjour à tous,

    je suis aussi sur cet exercice et j'ai une question, sûrement très bête, mais qui m'empêche de comprendre :

    Que vient faire cette variable "nouv" dans l'histoire? je ne comprends pas du tout son rôle ni comment elle produit son effet.

    Merci d'avance,

    EDIT : pardon : je propose le fruit de ma réflexion au cas où quelqu'un voudra me confirmer :
    cette fonction renvoie la valeur de "nouv" autant de fois qu'il y a de caractères dans la chaîne? donc le texte est complètement recréé, chaque caractère devenant une version de "nouv" : soit sans effet visible, soit il s'ajoute deux espaces....

  12. #12
    Expert éminent sénior
    Salut,

    Citation Envoyé par krwiss Voir le message
    cette fonction renvoie la valeur de "nouv" autant de fois qu'il y a de caractères dans la chaîne? donc le texte est complètement recréé, chaque caractère devenant une version de "nouv" : soit sans effet visible, soit il s'ajoute deux espaces....
    La fonction prend une chaine de caractères en entrée et retourne une chaine de caractères en sortie.
    Et comme Python ne permet pas la modification des chaines de caractères, impossible de ne pas en créer une nouvelle.

    Pour le reste, il faut apprendre à lire le code. Au début, c'est pénible car il faut se résoudre à prendre une feuille de papier, "tracer" l'exécution de chaque instruction et s'assurer qu'on le fait correctement. En fait, on s'habitue à lire le code comme le ferait Python.
    Et c'est pour vous permettre de faire l'exercice sur une feuille de papier que les exercices proposés travaillent sur des nombes, des chaines de caractères, des objets faciles à visualiser, transcrire.

    L'habitude étant prise, on se contentera plus tard de faire un "print" de l'état des objets à différentes étapes lorsque c'est "touffu" puis on apprendra à utiliser un débogueur symbolique.... mais dans la plupart de cas on saura reconnaitre les constructions de base et lire plus facilement le code sans avoir à l'exécuter pas à pas (ce qui sera difficile car les données seront bien plus abstraites).

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

  13. #13
    Futur Membre du Club
    super, merci beaucoup pour votre réponse. C'est clair maintenant.

    Je découvre le code sur le tard mais c'est vraiment passionnant.

    Je passe beaucoup de temps à essayer de résoudre les problèmes du livre sans regarder la solution.

    Parfois ça marche et parfois... c'est vraiment la galère et je dois alors me résoudre à regarder la solution mais à chaque fois, c'est très riche en enseignements.

  14. #14
    Nouveau membre du Club
    Salut Wiztricks,

    J'ai réalisé le code suivant sans regarder la solution du Swinnen.

    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
    def tripel(file):
     
        input_file = open(file, 'r')
        output_file = open('output.txt', 'a')
     
        while 1:
            line = input_file.readline()
            i=0
            while i < len(line):
                if line[i] == ' ':
                    line[i] == '   '
                    output_file.write(line[i])
                else:
                    output_file.write(line[i])
                i+=1
            if line == "":
                break
     
        input_file.close()    
        output_file.close()
     
        return output_file
     
    file = input("Entrez le nom du fichier à copier : ")
     
    tripel(file)


    Le code paraît bon mais l'espacement ne fonctionne pas.

    Je suis donc tombé sur ce topic et ai lu ceci :

    Citation Envoyé par Wiztricks
    Python ne permet pas la modification des chaines de caractères, impossible de ne pas en créer une nouvelle.
    Pourrais-tu tout d'abord m'en dire plus à ce propos ? Comment se fait-il que ça ne soit pas possible ?

    Sans donc trop comprendre pourquoi c'était nécessaire, j'ai créé une nouvelle variable neuw.

    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
    def tripel(file):
     
        input_file = open(file, 'r')
        output_file = open('output.txt', 'a')
     
        while 1:
            line = input_file.readline()
            i=0
            while i < len(line):
                neuw = '   '
                if line[i] == ' ':
                    neuw = neuw + '   '
                    output_file.write(neuw)
                else:
                    neuw = neuw + line[i]
                    output_file.write(neuw)
                i+=1
            if line == "":
                break
     
        input_file.close()    
        output_file.close()
     
        return output_file
     
    file = input("Entrez le nom du fichier à copier : ")
     
    tripel(file)


    Ça fonctionne.

    Je me suis finalement dit que l'on pouvait faire plus simple :

    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
    def tripel(file):
     
        input_file = open(file, 'r')
        output_file = open('output.txt', 'a')
     
        while 1:
            line = input_file.readline()
            i=0
            while i < len(line):
                neuw = '   '
                if line[i] == ' ':
                    output_file.write(neuw)
                else:
                    output_file.write(line[i])
                i+=1
            if line == "":
                break
     
        input_file.close()    
        output_file.close()
     
        return output_file
     
    file = input("Entrez le nom du fichier à copier : ")
     
    tripel(file)


    Et ça fonctionne.

  15. #15
    Membre actif
    Citation Envoyé par Matthieu_12 Voir le message


    Je me suis finalement dit que l'on pouvait faire plus simple :

    Bonjour,
    le plus simple est d'utiliser la méthode replace() :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s= "ceci est ma string"
    >>> s.replace(" ", "   ")
    'ceci   est   ma   string'

###raw>template_hook.ano_emploi###