Récupérer le contenu de répertoires

Récupérer le contenu de répertoires - Python - Programmation

Marsh Posté le 08-06-2005 à 02:55:18    

Bonjour à tous !!!
 
Voilà... l'idée est assez simple :
 
Récupérer le nom de tous les fichiers à partir d'un répertoire de base.
 
la structure est la suivante :
 
/ressources
-->/dir1
-->/dir2
-->/...
 
chaque "dir" contient 1 ou plusieurs fichier. on parse donc le répertoire de base ainsi que les sous-répertoires, en testant le type de fichier (mime) pour récupérer des types précis (jpg, gif, etc...). Récupérer le contenu avec listdir, j'y arrive, mais ce n'est pas récursif...
 
J'ai donc cherché un moment, puis je suis tombé sur la méthode os.walk. Mais c'est là que ça se complique.
 
Le but du jeu serai de retourner une chaine de caractère du genre :
 
dir1=file1.jpg;file2.jpg;file3.jpg|dir2=file1.jpg;file2.jpg;|dir3=file1.gif;file2.gif;file3.jpg
 
Mais je n'arrive pas à itérer sur les répertoires, puis droit après sur les fichiers... je n'itère que sur les répertoires, ou d'abord sur les répertoires, puis ensuite sur les fichiers...
 
voilà mon code de base...
 
import os;
 
path = os.path.join( os.getcwd(), 'ressources' )
final = ''
for root, dirs, files in os.walk(path, topdown=True):
    for name in dirs:
        final += name + "="
        for name in files :
             
            final += name + ";"
        final = final[0:-1]
        final += "|"
 
final = final[0:-1]
print final
 
 
si quelqu'un veut bien y jeter un oeil, ça serai gentil.
Sinon, est-ce qu'il existe une méthode qui permet de récupérer seulement la liste des sous-répertoires d'un répertoire précis, pour que je puisse décomposer en 2 actions : récupération des sous-répertoire / listdir de chaque sous-répertoire pour récupérer le contenu.
 
D'avance merci :)

Reply

Marsh Posté le 08-06-2005 à 02:55:18   

Reply

Marsh Posté le 08-06-2005 à 08:23:46    

[:kiki]
 
Les fichiers de "files" sont ceux de "root", "dirs" ce sont les sous répertoires de "root" [:kiki]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-06-2005 à 10:15:14    

Génial, ça m'aide bcp...
 
Déjà, lorsque j'itère d'une certaine manière sur les fichiers, j'obtiens les fichiers des sous-répertoires, donc je ne crois pas que "files" soient les fichiers de "root"...
 
Mais plus sérieusement, une réponse comme ça, je crois que je m'en serai passé, ça ne m'aide en rien...

Reply

Marsh Posté le 08-06-2005 à 10:29:13    

titouille a écrit :

Déjà, lorsque j'itère d'une certaine manière sur les fichiers, j'obtiens les fichiers des sous-répertoires


Non [:kiki]
walk est une procédure récursive, donc tu ES dans un sous répertoire, essaie d'afficher root + f avec f in files, tu verras [:kiki]

titouille a écrit :

Mais plus sérieusement, une réponse comme ça, je crois que je m'en serai passé, ça ne m'aide en rien...


Ok, super, t'as raison, mais regarde quand même les noms de variables et la manière dont tu essaies d'itérer sur tes files [:kiki]


Message édité par masklinn le 08-06-2005 à 10:30:43

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-06-2005 à 10:34:34    

Oui, je vois ce que tu veux dire, mais ça ne me dit toujours rien sur la syntaxe à employer pour itérer correctement avec walk, c'est à dire passer sur 1 répertoire, puis voir son contenu, puis passer au répertoire suivant, etc...
 
Voilà ce que j'aurai voulu faire en 1 seule action, mais là je le fais en 2 avec listdir :
 
 
import os;
 
path = os.path.join( os.getcwd(), 'ressources' )
final = ''
for root, dirs, files in os.walk(path, topdown=True):
    for name in dirs:
        final += "|" + name + "="
         
        myPath = os.path.join( root, name )
        myDirs = os.listdir( myPath )
        for name in myDirs :
            final += name + ";"
         
        final = final[0:-1]
     
final = final[1:]
print final
 
 
La question n'est pas de savoir que root est le "path", que dirs correspondents aux répertoires et files au fichiers... je ne crois pas être bête à ce point là...  
Mon problème, c'est plutot que je n'ai pas trouvé la bonne "syntaxe" dans ma boucle for.
 
 
Merci tout de même pour ta tentative, a+

Reply

Marsh Posté le 08-06-2005 à 10:41:31    

titouille a écrit :

La question n'est pas de savoir que root est le "path", que dirs correspondents aux répertoires et files au fichiers... je ne crois pas être bête à ce point là...  
Mon problème, c'est plutot que je n'ai pas trouvé la bonne "syntaxe" dans ma boucle for.


Ya des exemples dans la doc Python [:kiki]
 
Et sûrement d'autres dans Dive Into Python [:kiki]
 
RTFM quoi [:kiki]
 

import os
for root, dirs, files in os.walk(path):
    print "**** Folder %s ****"%(root)
    if(files):
        print "    ** Files: **"
        for f in files:
            print "        "+os.path.join(root, f)
    if(dirs):
        print "    ** Directories: **"
        for d in dirs:
            print "        "+os.path.join(root, d)


[:kiki]


Message édité par masklinn le 08-06-2005 à 10:41:53

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-06-2005 à 11:27:28    

Merci pour l'exemple, il était parlant. C'est vrai que je n'ai pas vraiment pris la peine de comprendre ce que tu voulais dire par :
 
Les fichiers de "files" sont ceux de "root", "dirs" ce sont les sous répertoires de "root"
 
Je n'avais pas fait la relation entre cette explication et la récursivité de la fonction. Ce n'est pas forcément une question de syntaxe "for", c'était plutot, comme je l'ai dit avant, implémenter le walk de manière à ce qu'il passe sur 1 répertoire, puis son contenu, puis le répertoire suivant et son contenu, etc...
 
Ton exemple est très démonstratif, comparé à l'explication de départ :)
 
En fait, au final, j'arrive à ça :
 
 
import os, mimetypes
 
authorized_types = ('application/x-shockwave-flash', 'image/jpeg', 'image/png')
with_extension = 1
 
path = os.path.join( os.getcwd(), 'ressources' )
final = ''
 
for root, dirs, files in os.walk(path):
     
    # get length of path
    if( root is path ) :
        count = len(root)
 
    # get directories
    if( root is not path ) :
        final += "|" + root[count:] + "="
         
    # get files in each directories
    if(files):
        for f in files:
            # test mimetype of file
            mimetype = mimetypes.guess_type( os.path.join( path, f ))
            if mimetype[0] == None :
                mmt = "None"
            else :
                mmt = mimetype[0]
 
            # test authorized files and extension requirement
            if mmt in authorized_types or "*" in authorized_types :
                if int(with_extension) == 0 :
                    f = f.split('.')[0]
                final += f +";"
             
        final = final[0:-1]
 
final = final[1:]
print final
 
 
 
Y a surement des trucs qu'on peut faire plus simplement (genre faire un if sur une ligne pour le mimetype[0] == None, mais je sais pas si ça existe en python), je ne fais que débuter en python. Mais graçe à toi, j'ai déjà pu comprendre ça, je vais pouvoir avancer.
 
Merci !! :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed