IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Python Discussion :

Aide pour exercice 9.7 de python 3


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Aide pour exercice 9.7 de python 3
    Bonjour, voila. j'ai du mal a réaliser l'exercice 9.7 de python 3, a savoir : "À partir de deux fichiers préexistants A et B, construisez un fichier C qui contienne al-
    ternativement un élément de A, un élément de B, un élément de A... et ainsi de suite
    jusqu’à atteindre la fin de l’un des deux fichiers originaux. Complétez ensuite C avec
    les éléments restant sur l’autre." Voici mon programme mais je n'arrive pas a trouver la solution. Sauriez-vous m'aider ?
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Dans un premier temps je dois vous dire que votre code ne fonctionneras pas sous Python 3. Deux raisons à cela:
    raw_input n'existe pas sous Python 3, il est remplacé par input.
    print est une fonction sous Python 3. print('tutu')
    Le tutoriel Python que vous suivez est donc celui pour Python 2, sans doute celui du site. Vous trouverez celui pour Python 3 ici : Apprendre à programmer avec Python 3 par Gérard Swinnen.

    Maintenant sur votre code:
    Les fonctions fichierA et fichierB sont identiques et puisque vous donnez le nom du fichier en argument (chapitre 7) vous pouvez n'en utiliser qu'une seule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def fichier(nomf):
        with open(nomf, "a") as f:
            while 1:
                msg= input("Entrez une ligne de texte : ")
                if msg == "":
                    break
                else:
                    f.write(msg+"\n")
    Ici with ferme automatiquement le fichier en fin de traitement, quoi qu'il arrive. Vous pouvez toujours utiliser open/close si cela vous gène.
    A ce stade du tuto vous avez vu while (chapitre 6) et break (chapitre 9) ainsi que if donc pas de problème pour écrire vos deux fichiers.

    Pour lire un fichier pas de problème non plus.
    Le présent chapitre vous montre comment lire une ligne complète, .readline() (Vous avez aussi vu readlines() mais malheureusement for in n'est abordé qu'au chapitre suivant... Passons donc sur cette solution).
    Vous devez donc ouvrir les fichier A et B en lecture, C en écriture et écrire une ligne de A dans C (.write(*) donc), une ligne de B dans C et recommencer jusqu'à la fin d'un des fichiers pour finir de remplir C avec la fin de l'autre. Pour cela vous avez while (voir l'exemple que je vous donne ci dessus ainsi que la fonction filtre en 9.8), a vous de trouver la condition pour le break. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Ouverture des fichiers
    Boucle while
        Lecture d'une ligne de A
        Lecture d'une ligne de B
        Si on est en fin de fichier pour A
            Le fichier à continuer a lire est B
            On arrête le while
        Si on est en fin de fichier pour B
            Le fichier à continuer a lire est A
            On arrête le while
        Ecriture d'une ligne de A dans C
        Ecriture d'une ligne de B dans C
    Ecriture dans C de ce qui reste dans l'autre fichier.
    Fermeture des fichiers
    A vous de remplacer, vous avez tout.

    Note: Attention avec readline()
    La méthode readline(), par exemple, ne lit qu'une seule ligne à la fois (en incluant le caractère de fin de ligne)
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Une autre 'construction' qui vous sembleras plus facile sans doute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Ouverture des fichiers
    Boucle While
        Lecture d'une ligne de A    
        Lecture d'une ligne de B
        Si on est à la fin des deux fichiers
            break
        Si la ligne de A contient quelque chose
            On écrit la ligne dans C
        Si la ligne de B contient quelque chose
            On écrit la ligne dans C
    Fermeture des fichiers
    Si je dit Si la ligne de A contient quelque chose il est possible aussi de dire Si la ligne de A n'est pas vide. A vous de voir pour savoir si une chaîne de caractère est vide, vous avez déjà abordé le sujet des chaînes lors du tuto. Lorsque vous aurez la solution vous pourrez l'appliquée à Si on est à la fin des deux fichiers.

    @++

    Edit: Pas nulle mais vide
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Une petite note que vous permettras de ficeler tout cela:
    Lorsque l'on est arriver à la fin d'un fichier readline retourne "".
    A vous de jouer
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Dans la fonction, à quoi sert "with open(nomf, "a") as f" ? je n'ai pas encore vu cette méthode..

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je sais que c'est pour ouvrir le fichier mais pourquoi with ... as f ?

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Comme dit plus haut utilisez open/close pour le moment.

    Pour ce qui est de votre question (Et puisque personne n'as donner de réponse, merci les gars ):
    L'instruction with est un 'Context Manager' (voir le lien): Il gère l'entrée et la sortie d'un objet.
    Pour être utiliser avec with un objet doit donc avoir une méthode __enter__() et une méthode __exit__(). C'est le cas pour un objet de type fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> fichier = open('unfichier', 'w')
    >>> fichier.__enter__()
    <open file 'unfichier', mode 'w' at 0xb78721d8>
    >>> fichier.write('1')
    >>> fichier.__exit__()
    >>> fichier.write('2')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: I/O operation on closed file
    Comme vous le voyez ici __exit__() 'ferme' le fichier.

    La synthaxe habituelle en est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with unobjet as unnom:
        un bloc d'instruction qui utilise unnom
    Ce qui reviens à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    avec unobjet que nous nommerons unnom:
        try:
            faire quelque chose avec unnom (c'est le block d'instruction sous le with)
        finally:
            'fermer' (*__exist__()) unnom
    (Enfin, presque... Il faudrait utiliser yield dans le try et for/in pour vraiment avoir un 'équivalent')

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def fichier(nomf):
        with open(nomf, "a") as f:
             utilise f comme référence au fichier nomf pour le reste du bloc.
        sortie du bloc d'instruction du with > fermeture de f
    J'espere que vous aurez compris le principe.

    @+

    A noter que lorsque je j'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345
    avec unobjet que nous nommerons unnom:
        try:
            faire quelque chose avec unnom (c'est le block d'instruction sous le with)
        finally:
            'fermer' (*__exist__()) unnom
    C'est que quelque soit les instructions dans le bloc de code du with celui ci appelleras la méthode __exit__(). D'ou la comparaison try/finally puisque vous avez déjà vu try.
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. Aide pour exercice livre "Apprendre à programmer en Python" par Swinnen
    Par reivilo1982 dans le forum Général Python
    Réponses: 4
    Dernier message: 28/02/2011, 12h35
  2. aide pour exercice sur les structures
    Par demetria dans le forum C
    Réponses: 10
    Dernier message: 25/09/2007, 22h11
  3. aide pour exercice
    Par tania dans le forum Algorithmes et structures de données
    Réponses: 26
    Dernier message: 14/09/2007, 19h33
  4. Aide pour exercices d'algo
    Par couls dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 27/08/2007, 14h05
  5. besoin d'aide pour exercice
    Par aurore973 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/05/2007, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo