J'ai un fichier qui peut se trouver à un endroit différent sur la machine de chaque utilisateur. Existe-t-il un moyen de mettre en œuvre une recherche pour le fichier? Un moyen de transmettre le nom du fichier et l'arborescence de répertoires à rechercher?
110
Réponses:
os.walk est la réponse, cela trouvera la première correspondance:
Et cela trouvera tous les matchs:
Et cela correspondra à un modèle:
la source
if name in file or name in dirs
for name in files:
échouera à la recherchesuper-photo.jpg
lorsqu'il estsuper-photo.JPG
dans le système de fichiers. (une heure de ma vie, j'aimerais revenir ;-) Une solution un peu désordonnée estif str.lower(name) in [x.lower() for x in files]
J'ai utilisé une version de
os.walk
et sur un répertoire plus grand, j'ai obtenu des durées d'environ 3,5 secondes. J'ai essayé deux solutions aléatoires sans grande amélioration, puis je l'ai fait:Bien que ce soit uniquement POSIX, j'ai 0,25 s.
À partir de là, je pense qu'il est tout à fait possible d'optimiser beaucoup la recherche entière d'une manière indépendante de la plate-forme, mais c'est là que j'ai arrêté la recherche.
la source
Si vous utilisez Python sur Ubuntu et que vous souhaitez uniquement qu'il fonctionne sur Ubuntu, un moyen beaucoup plus rapide est d'utiliser le
locate
programme du terminal comme celui-ci.search_results
est l'unlist
des chemins d'accès absolus aux fichiers. C'est 10 000 fois plus rapide que les méthodes ci-dessus et pour une recherche que j'ai effectuée, c'était environ 72 000 fois plus rapide.la source
Dans Python 3.4 ou plus récent, vous pouvez utiliser pathlib pour effectuer une globalisation récursive:
Référence: https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob
Dans Python 3.5 ou plus récent, vous pouvez également effectuer une globalisation récursive comme ceci:
Référence: https://docs.python.org/3/library/glob.html#glob.glob
la source
Pour une recherche rapide et indépendante du système d'exploitation, utilisez
scandir
https://github.com/benhoyt/scandir/#readme
Lisez http://bugs.python.org/issue11406 pour savoir pourquoi.
la source
scandir.walk()
la réponse de @ Nadia. Notez que si vous utilisez Python 3.5+,os.walk()
lesscandir.walk()
accélérations sont déjà disponibles. En outre, PEP 471 est probablement un meilleur document à lire pour plus d'informations que ce problème.Si vous travaillez avec Python 2, vous rencontrez un problème de récursivité infinie sur les fenêtres causé par des liens symboliques auto-référencés.
Ce script évitera de suivre ceux-ci. Notez que cela est spécifique à Windows !
Il renvoie une liste avec tous les chemins qui pointent vers des fichiers dans la liste des noms de fichiers. Usage:
la source
Ci-dessous, nous utilisons un argument booléen "first" pour basculer entre la première correspondance et toutes les correspondances (valeur par défaut équivalente à "find. -Name file"):
la source
La réponse est très similaire à celles existantes, mais légèrement optimisée.
Ainsi, vous pouvez trouver tous les fichiers ou dossiers par modèle:
soit par sous-chaîne:
ou en utilisant un prédicat:
pour rechercher uniquement des fichiers ou uniquement des dossiers - remplacez par exemple «dirs + files» par uniquement «dirs» ou seulement «files», selon ce dont vous avez besoin.
Cordialement.
la source
La réponse de SARose a fonctionné pour moi jusqu'à ce que je mette à jour à partir d'Ubuntu 20.04 LTS. Le léger changement que j'ai apporté à son code le fait fonctionner sur la dernière version d'Ubuntu.
la source