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 :

Ouverture d'un dossier


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut Ouverture d'un dossier
    Bonjour tout le monde:

    Je travail sur un projet qui consiste à traiter des données disponibles dans un fichier quelconque, quej'ai au début pris comme exemple pour tester le fonctionnement du projet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def main():  
        """ Fonction principale du programme """  
        infile="C:\\Documents and Settings\\All Users\\Données.doc"
    Sachant que: Ce document existe dans un sous dossier qui contient une dizaine de documents semblables, et que ce sous dossier est contenu dans un dossier parents au milieux de 4 autres sous dossiers qui contiennent eux même des fichiers doc que je dois aussi traiter. Comment faire pour gérer tout ces contretemps:

    Dossier 'config' contient 4 sous dossiers. Chaque sous dossier contient une dizaine de fichiers .doc qu'il faut ouvrir et analyser.

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    J'ai du louper un détail de la question, mais à première vue, si tu dois tout traiter tu dois tout traiter... Je ne vois pas en quoi ça pose problème non plus

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Comment faire pour ouvrir tout le dossier
    Dans l'exemple, je travaillas sur un fichier prototype qui est dans un sous dossier du dossier parent

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Pour obtenir tous les fichiers qui se trouvent dans le dossier, tu peux faire appel à os.listdir. C'est une fonction qui prend en paramètre le chemin vers le dossier, et qui te retourne une liste de tout ce qu'il contient.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Entre obtenir la liste des fichiers qu'il contient, et les ouvrir tous pour les traiter, il y a du chemin à faire et c'est cela qui me dérange.
    J'ai essayé avec un nouveau module pour moi: le module os avec sa fonction walk(top), mais le programme affiche des erreurs!!!

  6. #6
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Il te faut une fonction récursive pour visiter tous les sous dossiers.

    Pour info, os.linesep correspond au caractère pour passer à la ligne suivante (\r\n sous dos), et os.path.sep le caractère qui sépare les dossiers ( \ sous dos)
    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
    import os
    import os.path
     
    basedir = r"C:\Documents and Settings\All Users"
     
    def recurse(directory):
        print("Lecture du dossier %s" % directory)
     
        for entry in os.listdir(directory):
            fullname = directory + os.path.sep + entry
     
            if os.path.isdir(fullname):
                recurse(fullname)
     
            elif os.path.isfile(fullname) and entry.endswith('.doc'):
                # Traiter le fichier
     
        print("Fin du dossier %s%s" % (directory, os.linesep))

  7. #7
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    admettons cette arborescence (d=directory, f=file) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A        d
    |
    +-B          d
    |  |
    |  +-file1    f
    |  +-file2    f
    |
    +-C          d
    |  |
    |  +-file3    f
    |
    +-file4      f
    admettons également que tu veuilles traiter tous les fichiers du dossier A et de tous ces sous-dossiers, et que le script de situe dans le dossier parent de A:
    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
    def listOfFilesIn(dirPath):
    #fonction retournant une liste de tous les fichiers contenu dans
    #dirPath ainsi que dans tous ses sous-dossiers
    	res=[]
    	for obj in os.listdir(dirPath):
    		if os.path.isdir(dirPath+'/'+obj):
    			res+=listOfFilesIn(dirPath+'/'+obj)
    		else:
    			res.append(dirPath+'/'+obj)
    	return res
     
    for file in listOfFilseIn('./A'):
            ...
            [traitement des fichiers]
            ...
    Toutefois, si il y a beaucoup de fichiers, il serait plus judicieux d'utiliser un generator (plus économe en mémoire), plutôt qu'une fonction retournant une liste...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def listOfFilesIn(dirPath):
    	for obj in os.listdir(dirPath):
    		if os.path.isdir(dirPath+'/'+obj):
    			for f in listOfFilesIn(dirPath+'/'+obj): yield f
    		else:
    			yield(dirPath+'/'+obj)
    Si il y a des exceptions, il est également plus judicieux, je trouve, de travailler sur les résultats produits, que depuis la fonction...

    EDIT: grilled

    EDIT2: ah oui! bien vu le os.isdir, j'men rappelais plus

  8. #8
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par N.tox Voir le message
    Toutefois, si il y a beaucoup de fichiers, il serait plus judicieux d'utiliser un generator
    Ah, bonne idée ça tiens

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Merci tout d'abord pour les réponses, mais j'ai une petite question:

    Est ce que le type de fichier ne pose pas de problème, je n'ai pas de problème d'execption de fichier, je veux ouvrir le dossier qui contient 4 sous dossier qui contiennent à chacun d'eux une dizaine de fichiers, qui possèdent des extexions différentes:
    Par exemple: .rtf et .doc

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Aussi pour le code proposé, les '/' présents correspondent à quel sous dossier en fait. Car d'après l'arborescence proposé, il n'y a pas de correspondance à part le dossier A
    Merci

  11. #11
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Bon, pour les extensions, c'est un autre problème, à toit de savoir quels type de fichiers tu veux traiter, avec le code que je t'ai fourni, le generator retourne des strings, de là, il est assez simple de vérifier l'extension du fichier (et donc décider si il y a traitement ou pas ou encore quel type de traitement utiliser)... c'est à toi d'identifier ce que que tu faire... Dans l'exemple j'ai utiliser des fichiers sans extensions, mais peu importe puisque les noms retourné par os.listdir() incluent les extensions (si il y en a évidemment)

    Et en ce qui concerne le code que je t'ai proposé, voici un exemple de son utlisation (en reprenant l'arborescence et la location du script de mon message précédent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for f in listOfFilesIn('./A'):
        print f
    Ce qui nous affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ./A/B/file1
    ./A/B/file2
    ./A/C/file3
    ./A/file4
    Ce qu'il y a de bien dans python, c'est qu'en ce qui concerne les chemins, on peut utiliser des '/' quelque soit la plateforme, il les remplaces automatiquement par le signe approprié (par un '\' par exemple, si tu es sous windows). De même pour les résultats affichés, le signe séparateur correspond au signe séparateur utilisé par le système...

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Oui effectivement, mais si tu reviens à mon code au début de la discussion, la variable infile contenais le contenu de tout le document. Ici j'ai essayé de lui affecté la valeur de 'f', vu que c'est l'ouverture du répertoire, mais l'affichage ne done ausun résultat, ce qui montre que l'ouverture n'a pas été réalidé !!!

  13. #13
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Je suis pas le premier à te le dire, mais sois plus précis, par exemple ici, en fournissant le code que t'as essayé...

    Pour être précis dans l'énoncé d'un problème, il faut pouvoir répondre au minimum points 1 et 3 :
    1/ ce que je veux faire
    2/ quel est le contexte
    3/ ce que j'ai fait pour y parvenir (à ce que je veux faire)
    4/ quel problème je rencontre

    Tu verra que ce sera plus agréable pour tout le monde , et un précieux gain de temps.

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Voilà la problématique. Je viens de finir un programme qui analyse un document et n'affiche que les paragraphes dont la condition est respectée.
    Donc je programmais pour un document unique de type (.doc) et on m'a demandé de faire le même processus pour un répétoire qui contient......
    Donc il faut que j'adapte mon programme déjà conçu pour ce type de contrainte:
    Pour le programme en question, il est assez long et je neux peux le mettre directement sur un forum !

  15. #15
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Eh ben voilà, c'est déjà plus clair...

    eh bien le programme que tu as developpé, modifies-le si nécéssaire, pour que cela devienne une fonction qui prenne comme paramètre le chemin d'un fichier, ce qui ne devrait pas poser de problème, en toute logique...

    Une fois que c'es fait, on y touchera plus ! On créera simplement un programme, dans lequel on importera le précedent programme, puis on recupère la liste de tous les fichiers d'un dossier et de ses sous-dossiers, on vérifie pour chacun de ces fichiers, si c'est un .doc, et si oui, on lance la fonction du module (précédent programme) qu'on a importé avec comme paramètre le chemin du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import [le nom du précédent script]
     
    def listOfFilesIn(dirPath):
    	for obj in os.listdir(dirPath):
    		if os.path.isdir(dirPath+'/'+obj):
    			for f in listOfFilesIn(dirPath+'/'+obj): yield f
    		else:
    			yield(dirPath+'/'+obj)
     
    for f in listOfFIles('le/chemin/de/ton/choix'):
        if f[-4:]=='.doc':
            [le nom du précédent script].[le nom de la fonction] ( f )
    C'est pas plus compliqué

  16. #16
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Merci pour la réponse, ca commence à devenir plus clair

    Je débute en python, donc j'ai quelques petites questions à poser:

    Modifier mon programme pour qu'il ne prends que le chemin du fichier pour travailler dessus, je veux bien mais je ne sais pas comment faire?
    La variable que j'utilise est celle là:

    infile="C:\\Documents and Settings\\All Users\\Donnees.rtf". Quelle modification faut il appliquer pour suivre tes suggetions.

    En cas de deux types de fichiers, j'ai peu de me tromper. Faut il ajouter une deuxième boucle, ou simplement ajouter .rtf à coté de .doc ?

    Et encore Merci

  17. #17
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    As-tu étudié les fonctions ?

    Par exemple, on a un premier script qui est exactement ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    filename='./toto.txt'
    f_in=open(filename,'r')
    print f_in.read()
    f_in.close()
    Mais voilà ! On nous demande par la suite de faire un programme qui ouvre non seulement toto.txt mais aussi fifi.txt et loulou.txt !
    Eh ben comme on est des feignants (et c'est un trait essentiel pour programmer )
    on va modifier notre script (qui s'appelle 'ScriptTresLong.py' de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def printFile(filename):
        f_in=open(filename,'r')
        print f_in.read()
        f_in.close()
    et on créer un autre script "ScriptKiTuLaMor", dans le même dossier que le précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import ScriptTresLong
     
    for cheminFichier in ['./toto.txt','fifi.txt','loulou.txt']:
        ScriptTresLong.printFile(cheminFichier)
    Et voilà le concept, c'est tout

    Maintenant en ce qui concerne les deux extensions différentes, poses-toi la questions suivantes : Est-ce que l'accès aux données de ces formats se fait de la même façon ? Si oui, est-ce que je dois récupérer des données suivants les même conditions ? Si non à la première question, est-ce que ma fonction (de traitement, du premier script donc) permet de traiter indifféremment les deux types de fichiers ? Répondre à ces questions te menera à la réponse... Tu devrais sérieusement aller dans le coin des cours de python sur developpez.com et potasser celui de Gérard Swinnen, qui me parait adapté à ton niveau... Si tu débute complètement, tu verra que ce cours explique vraiment bien les choses.

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

Discussions similaires

  1. Avertissement à l'ouverture d'un dossier
    Par AT dans le forum Débuter
    Réponses: 2
    Dernier message: 15/11/2007, 15h18
  2. [FEDORA] Avoir une seule fênetre, après ouverture d'un dossier.
    Par rvfranck dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 20/06/2007, 12h20
  3. [WinXP SP2] Executable d'ouverture d'un dossier
    Par BizuR dans le forum Windows XP
    Réponses: 3
    Dernier message: 06/10/2006, 11h37
  4. ouverture d'un dossier a partir d'Access
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 02/08/2006, 14h08
  5. ouverture d'un dossier (folder)
    Par Lucifer83 dans le forum C++
    Réponses: 4
    Dernier message: 05/04/2006, 10h39

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