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 :

Exercice fichiers séquentiels.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 64
    Par défaut Exercice fichiers séquentiels.
    Bonjour à tous,

    Je dois réaliser ce petit programme mais je calles. Pourriez-vous y jeter un coup d'oeil et me dire quoi ?

    En fait, je dois nommer mon premier fichier ensuite le deuxième. Après je dois rentrer des valeurs réels dans le premier et savoir le lire, convertir en nombre entiers et les mettre dans le nouveau fichier créé et ensuite savoir lire celui-ci...

    Je penses que tout devrait fonctionner mais il ne lit pas le fichier ?!

    Merci =)

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    # -*- coding: utf-8 -*-
     
    def ecrireFichier(fichier) :
        openfichier = open(fichier, 'a')
        while 1:
            texte = raw_input("Entrez des nombres réels : ")
            if texte =="":
                break
            else:
                openfichier.write(texte+'\n')
        openfichier.close()
     
    def lireFichierReels(fichier) :
        openfichier = open(fichier, 'r')
        while 1:
            texte = openfichier.read()
            print texte
            if texte == "":
                break
        openfichier.close()
     
    def lireFichierEntiers(copiefichier):
        opencopiefichier = open(copiefichier, 'r')
        while 1:
            texte = opencopiefichier.read()
            print texte
            if texte == "":
                break
        copiefichier.close()
     
    def existenceFichier(fichier) :
        try:
            openfichier = open(nf,'r')
            openfichier.close()
            return 1
        except:
            return 0
     
    def valArrondie(fichier):
        floatfichier=float(fichier)
        intfichier=int(floatfichier + 0.5)
        return str(intfichier)
     
    def copieVal(fichier, copiefichier):
        openfichier=open(fichier, "r")
        opencopiefichier=(copiefichier, "w")
        while 1:
            ligne =fichier.readline()
            if ligne == "" or ligne == "\n":
                break
                ligne = valArrondie(ligne)
                opencopiefichier.write(ligne +"\n")
        print "Les nombres réels ont étés copiés dans le nouveau fichier."
        openfichier.close()
        opencopiefichier.close()
     
     
    fichier=raw_input("Nommez le fichier : ")
    copiefichier=raw_input("Nom du fichier destinataire : ")
     
     
    while 1:
        print " Que désirez-vous ? : \n\
        1 - Entrer des nombres réels.\n\
        2 - Lire le fichier des nombres réels.\n\
        3 - Convertir les nombres réels en entiers.\n\
        4 - Lire le fichier des nombres entiers.\n\
        5 - Sortir du programme.\n "
        choix=raw_input("Vôtre choix ? : ")
     
        if choix=="1":
            ecrireFichier(fichier)
     
        elif choix=="2":
            if existenceFichier(fichier):
                lireFichierReels(fichier)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="3":
            if existenceFichier(fichier):
                valArrondie(fichier)
                copieFichier(fichier, copiefichier)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="4":
            if existenceFichier(fichier):
                lireFichierEntiers(copiefichier)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="5":
            print "Au revoir !"
            break
     
        else:
            print "1, 2, 3, 4 ou 5 uniquement s.v.p !!"

  2. #2
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Ta fonction existenceFichier peut être facilement remplacée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os.path
    def existenceFichier(fichier) :
        return os.path.isfile(fichier)
    Dans valArrondie, tu fais float(fichier)... float est une fonction qui transforme une chaine en flottant, pas un nom de fichier, il faut donc ouvrir le fichier et lire les lignes du fichier, c'est elles qui doivent être passées en argument à float(), pas le nom de fichier. C'est un cas assez simple parce qu'il n'y a qu'une donnée par ligne et que float s'arrête quand il rencontre un séparateur, le "FIN DE LIGNE" en l'occurence. Il y a peut-être d'autre erreurs, j'ai regarde vite fait.

    A+

    Pfeuh

  3. #3
    Membre Expert 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
    Par défaut
    Bonjour,

    pfeuh a raison pour os.path mais comme votre code 'pourrait' fonctionner je pense que vous devriez le regarder de plus près.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def existenceFichier(fichier) :
        try:
            openfichier = open(nf,'r')
            openfichier.close()
            return 1
        except:
            return 0
    Le try vous cache l'erreur comme quoi nf n'existe pas.
    Essayez d'oublier les try (et while) un petit moment, c'est trompeur.

    @+

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    salut,

    je ne comprends pas PauseKawa: comme le fichier est ouvert en mode lecture, une exception IOError sera levée par open.

    donc cette fonction a bien le résultat attendu: le try capture bien l'existence du fichier.

    une petite remarque cependant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def existenceFichier(fichier) :
        try:
            openfichier = open(fichier,'r')
            openfichier.close()
            return 1
        except IOError:
            return 0
    il vaut toujours mieux expliciter le type de l'exception que l'on capture. par exemple si pour une raison ou pour une autre tu n'as pas enlevé tes moufles et que tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openfichier = opne(nf, 'r')
    ton try va capturer un NameError, et ta fonction va renvoyer 0 comme si le fichier n'existait pas (alors que ça peut ne pas être le cas).

    Ce petit apparté sur les exceptions, ne doit pas faire perdre de vue que dans ton cas il faut utiliser os.path.isfile ou os.path.exists comme signalé par pfeuh.

  5. #5
    Membre Expert 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
    Par défaut
    Bonsoir,

    Citation Envoyé par kango Voir le message
    je ne comprends pas PauseKawa: comme le fichier est ouvert en mode lecture, une exception IOError sera levée par open.
    Là c'est moi qui ne comprend pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys
     
    def existenceFichier(fichier):
        try:
            openfichier = open(fichier, 'r')
            openfichier.close()
            return 1
        except IOError:
            return 0
     
    print(existenceFichier(sys.argv[0]))
    Output
    Pourquoi un fichier ouvert en lecture lèverez une exception ?
    Le seul souci ici c'est le nom de la variable qui contient le string du nom de fichier (fichier > nf, voir les mots en rouge), c'est tout.

    @+

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    je ne me suis pas fait bien comprendre, ouvrir un fichier en mode lecture qui n'existe pas lève une exception. c'est précisément ce que l'op veut faire: tester si un fichier existe. il existe os.path.exists pour cela. je soulignais juste le fait qu'un except sans exception explicite était dangereux.

    et oui exact pour les mots en rouge, j'avais pas fait gaffe...

  7. #7
    Membre Expert 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
    Par défaut
    Bonjour,

    Citation Envoyé par pfeuh Voir le message
    Dans valArrondie, tu fais float(fichier)... float est une fonction qui transforme une chaine en flottant, pas un nom de fichier, il faut donc ouvrir le fichier et lire les lignes du fichier, c'est elles qui doivent être passées en argument à float(), pas le nom de fichier.
    A vrais dire la fonction valArrondie est correcte, c'est encore une 'erreur' dans les noms.
    La fonction valArrondie est utilisée ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def copieVal(fichier, copiefichier):
        openfichier=open(fichier, "r")
        opencopiefichier=(copiefichier, "w")
        while 1:
            ligne =fichier.readline()
            if ligne == "" or ligne == "\n":
                break
                ligne = valArrondie(ligne)
                opencopiefichier.write(ligne +"\n")
        print "Les nombres réels ont étés copiés dans le nouveau fichier."
        openfichier.close()
        opencopiefichier.close()
    Il aurais donc été plus judicieux d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def valArrondie(ligne):
        floatligne = float(ligne)
        intligne = int(floatligne+0.5)
        return str(intligne)
    Histoire de ne pas se perdre.

    Par contre il y a une erreur d'indentation dans copieVal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def copieVal(fichier, copiefichier):
        openfichier=open(fichier, "r")
        opencopiefichier=(copiefichier, "w")
        while 1:
            ligne =fichier.readline()
            if ligne == "" or ligne == "\n":
                break
            ligne = valArrondie(ligne) # <<<<
            opencopiefichier.write(ligne +"\n") # <<<
        print "Les nombres réels ont étés copiés dans le nouveau fichier."
        openfichier.close()
        opencopiefichier.close()
    @+

    A propos de la fonction existenceFichier:
    Le sujet n'étant pas ici de traiter du module os (l'import de celui ci est rapidement abordé bien avant, une personne curieuse y auras jeter un œil et la solution os.path lui sembleras compréhensible) ni de traiter des exceptions (là aussi, le warning dans le chapitre + de la curiosité et c'est bon) la solution présentée, bien que perfectible comme nous l'avons vu, me semble abordable au vu de ce qui est traité avant dans le tuto.
    Et a vrais dire os.path fait un try avec les module os et stat pour arriver au résultat, avec la gestion des exceptions (os.error) il est vrais.
    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
    # Does a path exist?
    # This is false for dangling symbolic links on systems that support them.
    def exists(path):
        """Test whether a path exists.  Returns False for broken symbolic links"""
        try:
            st = os.stat(path)
        except os.error:
            return False
        return True
     
     
    # This follows symbolic links, so both islink() and isdir() can be true
    # for the same path ono systems that support symlinks
    def isfile(path):
        """Test whether a path is a regular file"""
        try:
            st = os.stat(path)
        except os.error:
            return False
        return stat.S_ISREG(st.st_mode)
    @++

  8. #8
    Membre Expert 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
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    la solution présentée, bien que perfectible comme nous l'avons vu, me semble abordable au vu de ce qui est traité avant dans le tuto.
    Pas si 'perfectible' que cela en fait puisque quelque soit l'erreur (IOError, NameError, ...) l'utilisation du fichier n'est pas possible et c'est le but recherché. Seul le nom de la fonction porte ici à confusion: existenceFichier, on pourrais écrire isusable par exemple.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 64
    Par défaut
    Voilà j'ai réussi à faire le programme.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    # -*- coding: utf-8 -*-
     
    'fonction qui permet de rentrer des valeurs dans un fichier'
     
    def ecrireFichier(nomFichier) :
        openfichier = open(nomFichier, 'a')     #ouvre le fichier en mode "ajout"
        while 1:
            nbreR = raw_input("Entrez un nombre réel : ")
            if nbreR =="":
                break
            else:
                openfichier.write(nbreR+'\n')   #permet d'avoir tous les nombres les uns en dessou des autres
        openfichier.close()
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    'fonction qui permet de lire le fichier de départ'
     
    def lireFichierReels(nomFichier) :
        openfichier = open(nomFichier, 'r')     #ouvre le fichier en mode "lecture"
        lectureR = openfichier.read()
        print lectureR
        openfichier.close()
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    'fonction qui permet de lire le fichier "copie"'
     
    def lireFichierEntiers(nomFichierCopie):
        opencopiefichier = open(nomFichierCopie, 'r')
        lectureE = opencopiefichier.read()      #lit le contenu de tout le fichier et met tout dans la variable "lectureE"
        print lectureE
        opencopiefichier.close()
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    'fonction qui vérfifie si un fichier existe'
     
    def existenceFichier(nomFichier) :
        try:
            openfichier = open(nomFichier,'r')
            openfichier.close()
            return 1
        except:
            return 0
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    'fonction qui arrondi les nombres entiers'
     
    def valArrondie(nbre):
        nbreEntier=int(float(nbre)+.5)
        return nbreEntier
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    'fonction qui copie les nombres entiers vers le nouveau fichier'
     
    def copieFichier(nomFichier, nomFichierCopie):                        
        fichiersource=open(nomFichier,'r')
        fichierdestinataire=open(nomFichierCopie,'w')       #ouvre le fichier en mode "écriture"
     
        while 1:
            nbre = fichiersource.readline()
            if nbre == "" :
                break
            entier = valArrondie(nbre)
            fichierdestinataire.write(str(entier) +"\n")
     
        print "\n Copie terminée. \n"
     
        fichierdestinataire.close()
        fichiersource.close()
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    nomFichier=raw_input("Nommez le fichier : ")
    nomFichierCopie=raw_input("Nom du fichier destinataire : ")
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    #--------------#
    #     MENU     #
    #--------------#
     
    while 1:
        print " Que désirez-vous ? : \n\
        1 - Entrer des nombres réels.\n\
        2 - Lire le fichier des nombres réels.\n\
        3 - Convertir les nombres réels en entiers et les copier dans un nouveau fichier.\n\
        4 - Lire le fichier des nombres entiers.\n\
        5 - Sortir du programme.\n "
        choix=raw_input("Vôtre choix ? : ")
     
        if choix=="1":
            ecrireFichier(nomFichier)
     
        elif choix=="2":
            if existenceFichier(nomFichier):
                lireFichierReels(nomFichier)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="3":
            if existenceFichier(nomFichier):
                copieFichier(nomFichier, nomFichierCopie)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="4":
            if existenceFichier(nomFichier):
                lireFichierEntiers(nomFichierCopie)
            else :
                print "Le fichier n'existe pas !"
     
        elif choix=="5":
            print "Au revoir !"
            break
     
        else:
            print "\n 1, 2, 3, 4 ou 5 uniquement s.v.p !! \n"
     
    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
     
    #---------------#
    #      FIN      #
    #---------------#
    Merci

Discussions similaires

  1. [Turbo Pascal] Exercice fichier séquentiel
    Par agan2012 dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 07/07/2009, 14h10
  2. [PC] Fichiers séquentiels
    Par Goundy dans le forum Cobol
    Réponses: 4
    Dernier message: 12/04/2006, 09h58
  3. [VB]Lire fichier séquentiel
    Par nightwish dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/01/2006, 08h05
  4. fichiers séquentiels indexés VS base de données relationnell
    Par Clotilde dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/08/2005, 06h31
  5. [Fichiers séquentiels] compatibilité Delphi <-> C++
    Par soccersoft dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2004, 10h56

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