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 :

Problème de fermeture de fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique et création d'images animées et fixes de synthèse
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique et création d'images animées et fixes de synthèse
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut Problème de fermeture de fichier
    Bonjour à tous !

    M'étant depuis peu lancé dans la programmation avec cet admirable langage qu'est Python, je me trouve obligé aujourd'hui de me tourner vers vous car malgré diverses recherches sur le sujet, je n'ai pas réussi à trouver solution à mon problème... J'obtiens sur test de mon petit bout de code joint ci-dessous le message suivant sur la fermeture de mon fichier :

    Traceback (most recent call last):
    File "C:\Python26\sources\depandren2.py", line 167, in <module>
    ofi.close()
    NameError: name 'ofi' is not defined
    Voici le code incriminé :
    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
     
    # Ouverture séquentielle des fichiers adéquats. Je ne liste que les fichiers TXT
                                #-------------------------------------------------------------------------------
                                os.chdir("C:/Original EXPLF")
                                rep_W = os.getcwd()
                                arbo_W = os.listdir(rep_W)
                                listetxt = glob.glob(rep_W+os.sep+"*.txt")
                                for fic_W in listetxt:
                                    #fichiercontrole = fic_W
                                    print "fic_W : "+fic_W
                                    nomdeb=fic_W[18:25]         
                                    dept=fic_W[25:27]            
                                    print "dept : "+dept
                                    if depliste == dept:
                                        ofi = open(fic_W, 'r')
                                        ligne = ofi.readline()
                                        station = ligne[5:12]
                                        route = ligne[19:22]
                                        PR = ligne[29:38]
                                        print station
                                        #sys.exit()
                                    else:
                                        ofi.close()
    Je tiens à citer ici, tests à l'appui, que la variable dept est valide, ainsi que depliste, puisqu'elle provient d'une liste de département. La condition depliste==dept doit normalement tôt ou tard être vérifiée, si ma fermeture de fichier fonctionnait pour pouvoir poursuivre le contrôle sur tous les autres fichiers. Aurais-je oublié quelque chose quant à l'ouverture du fichier ? J'ai bien regardé, il me semble que non... La seule question que je me pose à l'heure qu'il est est la variable fic_W peut -elle accepter un nom de fichier constitué du chemin complet du fichier et le nom du fichier lui-même ou doit-on passer uniquement le nom du fichier seul ? A part çà, je ne vois pas d'où provient le problème....

    L'un d'entre vous pourrait-il m'aider ? En vous remerciant par avance.

  2. #2
    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
    bonjour,

    j'isole dans ton code ce qui pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ...:
        ofi = open(fic_W, 'r')
    else:
        ofi.close()

    si la condition est vérifiée, tu ouvres un fichier (il est alors rattaché au nom ofi dans le code). si elle n'est pas vérifiée, tu le fermes.

    imaginons que le premier passage dans cette boucle la condition n'est pas vérifiée et bien la variable 'ofi' n'est pas définie et tu as un NameError.

    je pense que c'est ce qui se produit.

    je ne sais pas exactement ce que tu veux faire mais cette structure est mauvaise.

    est ce que si tu utilises celle-ci, cela fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ...:
        ofi = open(fic_W, 'r')
        ...
        ofi.close()

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique et création d'images animées et fixes de synthèse
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique et création d'images animées et fixes de synthèse
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut
    Merci kango

    D'abord, j'ai fait un premier test en modifiant l'emplacement de ofi.close() comme tu l'as indiqué. Ca à fonctionné puisque mes tests de variables ce sont affichés.
    Ensuite, j'ai fait un second test en mettant en commentaire mes tests de variables, comme ci-dessous :
    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
     
                                os.chdir("C:/Original EXPLF")
                                rep_W = os.getcwd()
                                arbo_W = os.listdir(rep_W)
                                listetxt = glob.glob(rep_W+os.sep+"*.txt")
                                for fic_W in listetxt:
                                    #fichiercontrole = fic_W
                                    #print "fic_W : "+fic_W
                                    nomdeb=fic_W[18:25]         
                                    dept=fic_W[25:27]            
                                    #print "dept : "+dept
                                    if depliste == dept:
                                        ofi = open(fic_W, 'r')
                                        ligne = ofi.readline()
                                        station = ligne[5:12]
                                        route = ligne[19:22]
                                        PR = ligne[29:38]
                                        #print "station : "+station
                                        #print "route : "+route
                                        #print "PR : "+PR
                                        #sys.exit()
                                        ofi.close()
    L'interpreteur Python ne veut plus rien savoir, au lieu d'exécuter le code, après l'obtention d'un écran où il ne se passe rien pendant quelques secondes, j'obtiens ce message d'erreur :
    "IDLE's subprocess didn't make connection. Either IDL can't start a subprocess or personnal firewall software is blocking the connection"

    Mais qu'est-ce qu'il va chercher là ? Tout çà à cause d'une volonté d'alléger le code et mettant en commentaire des tests basics de variables ? Je le savais sensible quant à l'indentation, mais à ce point là !!!

    Je t'explique plus globalement le but de ma moulinette. J'ai deux répertoires de travail, l'un qui contient une liste de fichier XLS dont le nom n'est pas très clair (rep A), et un autre répertoire (rep B) qui contient des fichiers txt qui renferment dans leurs lignes divers codes correspondant à chaque nom de fichier XLS contenu dans mon répertoire A. Les fichiers du répertoire A sont rangés dans des sous-répertoires dont le nom représente un numéro de département. Ces deux répertoires sont à la racine du disque. Le but de mon programme est de renommer chaque fichier XLS du rep A avec les codes de correspondances qu'il trouvera dans les fichiers txt. Pour information, il faut savoir que les fichiers txt contiennent dans leur nom un indicatif de département. Pour renommer mes fichiers XLS, mon premier test à mener est d'abord de voir si le département du répertoire A correspond à l'indicatif du département contenu dans le nom des fichiers texte contenus dans le répertoire B d'où le test
    if depliste == dept:
    dans la moulinette ci-dessus.

    Je comprends que ce soit un peu nébuleux....

    Après un petit test, je continue. Je me suis dit que si çà se trouve, il y a un problème de mémoire, solution un peu empirique me diras-tu... Mais au premier abord, c'est tout ce qui m'est venu à l'esprit. J'ai donc éteint IDLE et je l'ai réinitialisé, puis j'ai fait tourner ma moulinette, et bien, là, elle à fonctionné sans problème. Me suis-je trompé sur la source de ce problème ? Là, j'aimerais comprendre tout de même....

  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
    il m'arrive d'avoir des soucis avec IDLE et du coup je préfère ne plus l'utiliser. c'est une question de goût.

    essaie ton script sans passer par IDLE, s'il fonctionne c'est un soucis d'IDLE et donc tu n'as rien à faire de plus

    j'utilise notepad++ sur Windows: pour tester le script c'est moins bien mais pour l'écrire je préfère

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur informatique et création d'images animées et fixes de synthèse
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique et création d'images animées et fixes de synthèse
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut
    Chouette ! Merci pour ton aide si précieuse kango. Maintenant, pour la fermeture des fichiers en lecture, je saurais mieux placer mon close....

    Merci beaucoup à toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de fermeture de fichier
    Par babybell dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/12/2009, 08h12
  2. Streaming: Problème de fermeture de fichier
    Par ludogoal dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 12/12/2008, 16h59
  3. [Object REXX] Problème de fermeture de fichiers
    Par Tinfolley dans le forum Autres langages
    Réponses: 0
    Dernier message: 23/04/2008, 10h28
  4. [Perl] Problème de fermeture de fichier oO
    Par PlazaDel62 dans le forum Langage
    Réponses: 0
    Dernier message: 16/04/2008, 17h16
  5. Problème de fermeture de fichier CloseHandle
    Par bubulemaster dans le forum Delphi
    Réponses: 5
    Dernier message: 27/07/2007, 14h51

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