[Python] Lister un dossier avec récursivité
Résolu/Fermé
A voir également:
- Python lister les dossiers d'un répertoire
- Citizen code python avis - Accueil - Outils
- Mettre un mot de passe sur un dossier - Guide
- \R python ✓ - Forum Python
- Répertoire téléphonique gratuit - Télécharger - Bureautique
22 réponses
Utilisateur anonyme
Modifié par fred1599 le 30/01/2014 à 15:47
Modifié par fred1599 le 30/01/2014 à 15:47
Attention, thomas différent de Thomas, différent de thoMas, ... ce n'est pas sensible à la casse comme dans pratiquement tous langages de programmation d'ailleurs
devrait le faire je pense...
import os Filetxt = 'c:\\users\\thomas\\desktop\\listingDir.txt' mydir = r'c:\users\thomas\desktop' fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle for path, dirs, files in os.walk(mydir): for filename in files: filename = filename.lower() if filename.find("thomas") != -1: search = os.path.join(path, filename) fichier.write(search+'\n') fichier.close()
devrait le faire je pense...
Utilisateur anonyme
28 janv. 2014 à 20:57
28 janv. 2014 à 20:57
Bonjour Fred.
Et merci, ton code fonctionne bien avec les extensions.
Mais si je cherche avec un mot, cela ne fonctionne pas.
Je vais voir si je trouve rien de mon côté.
@++
Et merci, ton code fonctionne bien avec les extensions.
Mais si je cherche avec un mot, cela ne fonctionne pas.
Je vais voir si je trouve rien de mon côté.
@++
Utilisateur anonyme
28 janv. 2014 à 21:05
28 janv. 2014 à 21:05
Re ;)
https://docs.python.org/release/2.5.2/lib/string-methods.html
Je vois donc endswith et startswith.
Cela fonctionne bien.
Mais si l'élément ne se trouve, ni à l'extrême gauche, ni à l'extrême droite : faut que je trouve un moyen pour me faire comprendre ^^
En tout cas, merci de ta réponse, cela va m'aider pour d'autres scripts.
Bon, c'est pas tout, faut que j'aille faire des recherches.
++
https://docs.python.org/release/2.5.2/lib/string-methods.html
Je vois donc endswith et startswith.
Cela fonctionne bien.
Mais si l'élément ne se trouve, ni à l'extrême gauche, ni à l'extrême droite : faut que je trouve un moyen pour me faire comprendre ^^
En tout cas, merci de ta réponse, cela va m'aider pour d'autres scripts.
Bon, c'est pas tout, faut que j'aille faire des recherches.
++
Utilisateur anonyme
29 janv. 2014 à 10:28
29 janv. 2014 à 10:28
Je n'ai toujours pas compris précisément ce que tu cherches à faire...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
Modifié par tonton_83 le 29/01/2014 à 11:38
Modifié par tonton_83 le 29/01/2014 à 11:38
En fait :
~~ avec endswith : cela permet de faire une recherche récursive d'un fichier dont on connait la fin du nom.
~~ avec startswith : cela permet de faire une recherche récursive d'un fichier dont on connait le début du nom.
Mon problème :
C'est que je peux connaitre un morceau du nom de fichier mais je ne connais pas sa position.
C'est pour cela que j'ai utilisé les astérisques ( * ).
Dans ce style :
ou :
Donc je continue mes recherches ;)
@+ et merci à toi.
~~ avec endswith : cela permet de faire une recherche récursive d'un fichier dont on connait la fin du nom.
~~ avec startswith : cela permet de faire une recherche récursive d'un fichier dont on connait le début du nom.
Mon problème :
C'est que je peux connaitre un morceau du nom de fichier mais je ne connais pas sa position.
C'est pour cela que j'ai utilisé les astérisques ( * ).
Dans ce style :
mydir = 'c:\\users\\thomas\\desktop\\python\\*.*.
ou :
mydir = 'c:\\users\\thomas\\desktop\\python\\*
Donc je continue mes recherches ;)
@+ et merci à toi.
Utilisateur anonyme
29 janv. 2014 à 12:45
29 janv. 2014 à 12:45
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle for path, dirs, files in os.walk(mydir): for filename in files: if filename.find("motachercher") != -1: search = os.path.join(path, filename) fichier.write(search+'\n') fichier.close()
?
Ça recherche dans le nom du fichier une sous chaine, c'est ça que tu veux?
Sinon donne un exemple qui fonctionne et un qui ne doit pas fonctionner.
Utilisateur anonyme
Modifié par tonton_83 le 29/01/2014 à 18:55
Modifié par tonton_83 le 29/01/2014 à 18:55
Salut.
Le dernier code ne fonctionne pas.
Si j'ai les 3 fichiers suivants :
Je veux que, quand je liste le dossier, je demande au script de recherche en précisant la chaine de caractère suivante : thomas.
Le code avec endswith fonctionne, ainsi qu'avec startswith.
Mais si la chaine de caractèré précisée ne se trouve ni au début, ni à la fin : ces fichiers sont ignorés.
Voici un code qui fonctionne :
Un code qui fonctionne, mais sans récursivité
Merci encore de ton aide.
@++
Le dernier code ne fonctionne pas.
Si j'ai les 3 fichiers suivants :
xxxthomasyyy.txt
thomasxxxyyy.txt
xxxyyy.txt
Je veux que, quand je liste le dossier, je demande au script de recherche en précisant la chaine de caractère suivante : thomas.
Le code avec endswith fonctionne, ainsi qu'avec startswith.
Mais si la chaine de caractèré précisée ne se trouve ni au début, ni à la fin : ces fichiers sont ignorés.
Voici un code qui fonctionne :
import os
for path, dirs, files in os.walk("c:\\users\\thomas\\desktop\\"):
for filename in files :
print (os.path.join(path, filename))
Un code qui fonctionne, mais sans récursivité
import os
mydir='c:\\users\\thomas\\desktop'
Filetxt="ListingDirSimple.txt"
fichier = open(Filetxt, "w")
entete = ['Listindir ~~ little boy62\n', # Notez l'utilisation des
'\n' # guillemets ou de l'apostrophe
'dossier de recherche : '+mydir,
'\n\n'
]
fichier.writelines(entete)
fichier.close()
files = os.listdir(mydir)
for file in files:
mysearch=mydir+file
fichier = open(Filetxt, "a")
fichier.write(mysearch+'\n')
Merci encore de ton aide.
@++
Utilisateur anonyme
29 janv. 2014 à 20:50
29 janv. 2014 à 20:50
Mais ça doit fonctionner, preuve à l'appui, le seul -1 est bien dans le cas où on ne trouve pas la sous chaine thomas.
Je voudrais bien voir le code que tu as testé et que tu as ajouté au mien...
>>> test = ["xxxthomasyyy.txt", "thomasxxxyyy.txt", "xxxyyy.txt"] >>> for chaine in test: ... print(chaine.find('thomas')) ... 3 0 -1
Je voudrais bien voir le code que tu as testé et que tu as ajouté au mien...
Utilisateur anonyme
29 janv. 2014 à 21:22
29 janv. 2014 à 21:22
Re ;)
Voici le code
J'ai peut-être fauté quelque part, mais je ne vois pas où.
Si tu peux me mettre sur la voie, stp, ça serait sympa. ;)
Bonne soirée à toi.
Et merci encore.
Voici le code
import os
Filetxt = 'c:\\users\\thomas\\desktop\\listingDir.txt'
mydir = 'c:\\users\thomas\\desktop\\'
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle
for path, dirs, files in os.walk(mydir):
for filename in files:
if filename.find("thomas") != -1:
search = os.path.join(path, filename)
fichier.write(search+'\n')
fichier.close()
J'ai peut-être fauté quelque part, mais je ne vois pas où.
Si tu peux me mettre sur la voie, stp, ça serait sympa. ;)
Bonne soirée à toi.
Et merci encore.
Utilisateur anonyme
29 janv. 2014 à 21:50
29 janv. 2014 à 21:50
Ça semble correct. Tu as un message d'erreur ?
Qu'y a-t-il comme résultat dans ton fichier ?
Qu'y a-t-il comme résultat dans ton fichier ?
Utilisateur anonyme
29 janv. 2014 à 21:55
29 janv. 2014 à 21:55
Salut.
Je n'ai pas d'erreur.
J'ai juste un fichier vide.
Et même si je met un autre terme, début ou fin du nom du fichier, c'est la même chose.
Faut que je teste ;)
@+
Je n'ai pas d'erreur.
J'ai juste un fichier vide.
Et même si je met un autre terme, début ou fin du nom du fichier, c'est la même chose.
Faut que je teste ;)
@+
Utilisateur anonyme
29 janv. 2014 à 22:28
29 janv. 2014 à 22:28
Chez moi en tout cas je viens de tester, ça fonctionne très bien
Tu verras si tes fichiers apparaissent à l'écran.
import os for root, dirs, files in os.walk(mydir): for filename in files: if filename.find('thomas') != -1: print(filename)
Tu verras si tes fichiers apparaissent à l'écran.
Utilisateur anonyme
30 janv. 2014 à 09:36
30 janv. 2014 à 09:36
Salut.
En fait, rien ne s'affiche.
J'ai remplacé root par path, idem.
Je suis à la fois sous windows 7 / windows 8.
UAC désactivé, tout se lance avec les droits admin.
Je me demande si ce n'est pas à cause de mon architecture en 64bits.
Faut que je vois ca.
Je vais essayer de compacter ceci en exe. Et le lancer en tant qu'admin.
++
En fait, rien ne s'affiche.
J'ai remplacé root par path, idem.
Je suis à la fois sous windows 7 / windows 8.
UAC désactivé, tout se lance avec les droits admin.
Je me demande si ce n'est pas à cause de mon architecture en 64bits.
Faut que je vois ca.
Je vais essayer de compacter ceci en exe. Et le lancer en tant qu'admin.
++
Utilisateur anonyme
30 janv. 2014 à 11:48
30 janv. 2014 à 11:48
Salut.
Et merci, c'était la bonne réponse :D
Ce code fonctionne :
Par contre, je dois avoir 27 fichiers trouvés...
J'en ai que 3.
Mais bon, grâce à ton aide, on a bien avancé :)
merci.
@++ et bon appétit.
Et merci, c'était la bonne réponse :D
Ce code fonctionne :
import os
Filetxt = 'c:\\users\\thomas\\desktop\\listingDir.txt'
mydir = r'c:\users\thomas\desktop'
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle
for path, dirs, files in os.walk(mydir):
for filename in files:
if filename.find("thomas") != -1:
search = os.path.join(path, filename)
fichier.write(search+'\n')
fichier.close()
Par contre, je dois avoir 27 fichiers trouvés...
J'en ai que 3.
Mais bon, grâce à ton aide, on a bien avancé :)
merci.
@++ et bon appétit.
Utilisateur anonyme
30 janv. 2014 à 12:27
30 janv. 2014 à 12:27
Si tu as 27 fichiers avec le mot thomas inscris dedans, c'est ok, non?
Utilisateur anonyme
30 janv. 2014 à 13:52
30 janv. 2014 à 13:52
Re ;)
J'ai 27 fichiers ayant thomas inscrit dans le nom du fichier.
Mais le script, dans le rapport créé, m'en affiche que 3.
Et je ne sais pas pourquoi ^^
++
J'ai 27 fichiers ayant thomas inscrit dans le nom du fichier.
Mais le script, dans le rapport créé, m'en affiche que 3.
Et je ne sais pas pourquoi ^^
++
Utilisateur anonyme
30 janv. 2014 à 15:58
30 janv. 2014 à 15:58
Salut.
Trop fort.
Avec le dernier code, je trouve 30 fichiers, alors qu'avec un logiciel, j'en trouve 27.
Décidément, le python trouve davantage en plus rapide. ;)
J'aurai surement encore une question, mais là, je vais essayer de chercher par moi-même.
Je te remercie pour toutes ces réponses.
Je vais mettre ce topic en favoris, tous les codes vont me servir :)
@+
Trop fort.
Avec le dernier code, je trouve 30 fichiers, alors qu'avec un logiciel, j'en trouve 27.
Décidément, le python trouve davantage en plus rapide. ;)
J'aurai surement encore une question, mais là, je vais essayer de chercher par moi-même.
Je te remercie pour toutes ces réponses.
Je vais mettre ce topic en favoris, tous les codes vont me servir :)
@+
Utilisateur anonyme
30 janv. 2014 à 16:54
30 janv. 2014 à 16:54
Salut.
je vais encore t'embêter. (^^ )
J'ai fait ce code :
Le fichier créé est vide xD
Le problème vient de cette ligne je suppose : for path, dirs, files in os.walk("r'"+mydir):
D'ailleurs, en faisant cela :
Ca fonctionne, mais on voit : r'
Où ai-je fauté encore ?
@++ et merci.
je vais encore t'embêter. (^^ )
J'ai fait ce code :
import os
print('indiquer le dossier où débuter la recherche')
mydir = input()
Filetxt = "c:\\users\\thomas\\desktop\\listingDir.txt"
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle
for path, dirs, files in os.walk("r'"+mydir):
for filename in files:
filename = filename.lower()
if filename.find("thomas") != -1:
search = os.path.join(path, filename)
fichier.write(search+'\n')
fichier.close()
Le fichier créé est vide xD
Le problème vient de cette ligne je suppose : for path, dirs, files in os.walk("r'"+mydir):
D'ailleurs, en faisant cela :
import os
print('indiquer le dossier où débuter la recherche')
mydir = input("r'")
Filetxt = "c:\\users\\thomas\\desktop\\listingDir.txt"
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle
for path, dirs, files in os.walk(mydir):
for filename in files:
filename = filename.lower()
if filename.find("thomas") != -1:
search = os.path.join(path, filename)
fichier.write(search+'\n')
fichier.close()
Ca fonctionne, mais on voit : r'
Où ai-je fauté encore ?
@++ et merci.
Utilisateur anonyme
30 janv. 2014 à 17:23
30 janv. 2014 à 17:23
mydir = r"{}".format(input("Entrer le répertoire: "))
Tu entres ton répertoire sans guillemets!
Utilisateur anonyme
30 janv. 2014 à 21:37
30 janv. 2014 à 21:37
Salut.
Cela fonctionne impeccable.
Ensuite, j'ai essayé de trouver comment faire un goto, ou un équivalent, et je suis tombé sur une de tes réponses.
https://forums.commentcamarche.net/forum/affich-28883584-faire-une-boucle-sur-python-qui-relance-le-programme
J'ai donc au final créer ce code :
Voilà, tout beau (je crois ^^) et fonctionnel.
Merci beaucoup à toi, j'y serais jamais arrivé sans toutes ces aides que tu m'as apportées.
@++
Cela fonctionne impeccable.
Ensuite, j'ai essayé de trouver comment faire un goto, ou un équivalent, et je suis tombé sur une de tes réponses.
https://forums.commentcamarche.net/forum/affich-28883584-faire-une-boucle-sur-python-qui-relance-le-programme
J'ai donc au final créer ce code :
import os
continuer = True
while continuer:
os.system("cls")
print("Indiquez le dossier où débuter la recherche.\nPour information, le glissez/déposer peut fonctionner.")
mydir = r"{}".format(input("\nEntrez le répertoire: "))
os.system("cls")
print("\nSi vous recherchez un fichier, dont vous connaissez le nom, ou une partie ?\nIndiquez-le.")
print("\nUne recherche complète ?\nAppuyez sur Entrée sans rien indiquer.\n")
mysearch = input("Nom (ou partie) du fichier: ")
Filetxt = "c:\\users\\thomas\\desktop\\listingDir.txt"
fichier = open(Filetxt, 'w')
entete = ['Listindir ~~ little boy62\n\n', # Notez l'utilisation des
'Dossier de recherche : '+mydir+'\n', # guillemets ou de l'apostrophe
'Comportant cette chaine dans le nom du fichier : '+mysearch+'\n\n']
fichier.writelines(entete)
fichier.close()
fichier = open(Filetxt, 'a') # à mettre en dehors de la boucle
for path, dirs, files in os.walk(mydir):
for filename in files:
filename = filename.lower()
if filename.find(mysearch) != -1:
search = os.path.join(path, filename)
fichier.write(search+'\n')
fichier.close()
os.system("cls")
print("La recherche est terminée.\nVoulez vous revenir au programme ?\n1 : oui\n2 : non")
choix = input("votre choix ? ")
if choix not in ('1'):
continuer = False
Voilà, tout beau (je crois ^^) et fonctionnel.
Merci beaucoup à toi, j'y serais jamais arrivé sans toutes ces aides que tu m'as apportées.
@++
30 janv. 2014 à 15:54
Je ne savais pas pour la casse.
Par contre, j'ai fais de même en autoIt et en batch, sans avoir de faire ceci.
Mais bon, le python me plait :=)
Je teste ton code. Merci
++
30 janv. 2014 à 16:08
Bonne continuation...