J'essaie d'obtenir une liste de fichiers dans un répertoire en utilisant Python, mais je ne veux pas une liste de TOUS les fichiers.
Ce que je veux essentiellement, c'est la possibilité de faire quelque chose comme ce qui suit mais en utilisant Python et sans exécuter ls.
ls 145592*.jpg
S'il n'y a pas de méthode intégrée pour cela, je pense actuellement à écrire une boucle for pour parcourir les résultats d'un os.listdir()
et pour ajouter tous les fichiers correspondants à une nouvelle liste.
Cependant, il y a beaucoup de fichiers dans ce répertoire et j'espère donc qu'il existe une méthode plus efficace (ou une méthode intégrée).
Réponses:
glob.glob('145592*.jpg')
la source
glob.glob('145592*.jpg')
imprime tout le chemin absolu des fichiers alorsls 145592*.jpg
qu'imprime seulement la liste des fichiers.glob()
utilise uniquement listdir + fnmatch, plutôt que des appels spéciaux du système d'exploitation pour effectuer le filtrage générique. Par exemple, sous Windows, l'FindFirstFile
API vous permet de spécifier des caractères génériques afin que le système d'exploitation effectue le filtrage directement et probablement plus efficacement (je ne pense pas qu'il existe un équivalent sous Linux).glob.glob()
est certainement la façon de le faire (selon Ignacio). Cependant, si vous avez besoin d'une correspondance plus compliquée, vous pouvez le faire avec une compréhension de liste etre.match()
, quelque chose comme ça:Plus flexible, mais comme vous le constatez, moins efficace.
la source
[0-9]+
[0123456789]
séquences ( voir la documentation ), et il a également lafnmatch.filter()
fonction qui rend cette boucle légèrement plus efficace.Rester simple:
Je préfère cette forme de listes de compréhension car elle se lit bien en anglais.
Je lis la quatrième ligne comme suit: Pour chaque fn dans os.listdir pour mon chemin, donnez-moi uniquement celles qui correspondent à l'une de mes extensions incluses.
Il peut être difficile pour les programmeurs novices de Python de vraiment s'habituer à utiliser des compréhensions de liste pour le filtrage, et il peut y avoir une surcharge de mémoire pour de très grands ensembles de données, mais pour lister un répertoire et d'autres tâches de filtrage de chaîne simples, les compréhensions de liste conduisent à plus de netteté code documentable.
La seule chose à propos de cette conception est qu'elle ne vous protège pas contre l'erreur de passer une chaîne au lieu d'une liste. Par exemple, si vous convertissez accidentellement une chaîne en liste et que vous finissez par vérifier tous les caractères d'une chaîne, vous pourriez finir par obtenir une série de faux positifs.
Mais il vaut mieux avoir un problème facile à résoudre qu'une solution difficile à comprendre.
la source
any()
ici, carstr.endswith()
prend une séquence de fins.if fn.endswith(included_extentensions)
est plus que suffisant.str.endswith(seq)
que Martijn a souligné, ce n'est pas correct, car un fichier doit se terminer.ext
pour qu'il ait cette extension. Ce code trouvera également (par exemple) un fichier appelé "myjpg" ou un répertoire nommé simplement "png". Pour corriger, il suffit de préfixer chaque extensionincluded_extensions
avec un.
.included_extensions
vsincluded_extentsions
? Dommage car sinon c'est ma réponse préférée.Une autre option:
https://docs.python.org/3/library/fnmatch.html
la source
glob
fait sur une seule ligne.glob
retour du chemin complet au lieu deos.listdir
simplement renvoyer le nom du fichier. C'est du moins ce qui se passe dans Python 2.Filtrer avec
glob
module:Importer glob
Cartes génériques:
Extension du filtre
.txt
:Un seul personnage
Plages de nombres
Gammes alphabétiques
la source
Code préliminaire
Solution 1 - utilisez "glob"
Solution 2 - utilisez "os" + "fnmatch"
Variante 2.1 - Recherche dans le répertoire courant
Variante 2.2 - Recherche récursive
Résultat
Solution 3 - utilisez "pathlib"
Remarques:
la source
utilisez os.walk pour lister récursivement vos fichiers
la source
file.endswith(alist_filter)
est assez.Cela vous donnera une liste de fichiers jpg avec leur chemin complet. Vous pouvez remplacer
x[0]+"/"+f
parf
juste pour les noms de fichiers. Vous pouvez également remplacerf.endswith(".jpg")
par n'importe quelle condition de chaîne que vous souhaitez.la source
vous aimerez peut-être aussi une approche de plus haut niveau (j'ai implémenté et empaqueté comme findtools ):
peut être installé avec
la source
Noms de fichiers avec les extensions "jpg" et "png" dans "chemin / vers / images":
la source
Vous pouvez utiliser pathlib qui est disponible dans la bibliothèque standard Python 3.4 et supérieure.
la source
Vous pouvez définir un modèle et le vérifier. Ici, j'ai pris le motif de début et de fin et je les ai recherchés dans le nom de fichier. FICHIERS contient la liste de tous les fichiers d'un répertoire.
la source
Que diriez-vous de str.split ()? Rien à importer.
la source
f.endswith('.jpg')
(mais sélectionnera égalementfilename.jpg.ext
)Vous pouvez utiliser subprocess.check_ouput () comme
Bien sûr, la chaîne entre guillemets peut être tout ce que vous souhaitez exécuter dans le shell et stocker la sortie.
la source
ls
La sortie de ne doit pas être analysée .