Obtenir une liste filtrée des fichiers dans un répertoire
Je suis en train d'essayer d'obtenir une liste de fichiers dans un répertoire à l'aide de Python, mais je ne veux pas une liste de TOUS les fichiers.
Ce que j'ai essentiellement voulez, c'est la capacité de faire quelque chose comme ce qui suit, mais à l'aide de Python et de la non-exécution ls.
ls 145592*.jpg
Si il n'existe pas de méthode intégrée pour cela, je suis en cours de réflexion de l'écriture d'une boucle for pour parcourir les résultats d'une os.listdir()
et pour ajouter tous les fichiers correspondants à une nouvelle liste.
Cependant, il y a beaucoup de fichiers dans ce dossier et donc je suis en espérant y est la méthode la plus efficace (ou une méthode intégrée).
- [Ce lien peut vous aider 🙂 Obtenir une liste filtrée des fichiers dans un répertoire ](codereview.stackexchange.com/a/33642)
- Notez que vous pourriez prendre un soin particulier à propos de l'ordre de tri que si cela est important pour votre application.
Vous devez vous connecter pour publier un commentaire.
glob.glob('145592*.jpg')
glob.glob('145592*.jpg')
imprime tout le chemin absolu des fichiers tout enls 145592*.jpg
imprime uniquement la liste des fichiers.glob()
utilise juste listdir+fnmatch, plutôt que de spécial appels de système d'exploitation pour faire le générique de filtrage. Par exemple, sous Windows, leFindFirstFile
API vous permet de spécifier des caractères génériques de sorte que le système d'exploitation ne le filtrage directement, et sans doute de manière plus efficace (je ne pense pas qu'il y a un équivalent sur Linux).145592*.jpg
, mais tous les fichiers qui remplissent (145592*.jpg
OU145592*.png
OU145592*.gif
)?glob.glob()
est certainement le chemin à faire (comme par Ignacio). Toutefois, si vous avez besoin de plus compliqué correspondant, vous pouvez le faire avec une compréhension de liste etre.match()
, quelque chose comme ça:Plus souple, mais comme vous le notez, de moins en moins efficace.
[0-9]+
[0123456789]
séquences (voir les docs), et il a aussi lafnmatch.filter()
fonction qui rend cette boucle légèrement plus efficace.Faire simple:
Je préfère cette forme d'interprétations de la liste, car il se lit bien en anglais.
J'ai lu la quatrième ligne comme:
Pour chaque fn dans les os.listdir pour mon chemin, donne-moi seulement ceux qui correspondent à l'une quelconque de mes extensions.
Il peut être difficile pour le novice de python pour les programmeurs de s'habitue à l'aide d'interprétations de la liste pour le filtrage, et il peut avoir une certaine surcharge de la mémoire pour les très grands ensembles de données, mais pour le listage d'un répertoire et d'autres chaîne simple filtrage des tâches, des interprétations de la liste conduire à plus propre documentable code.
La seule chose à propos de cette conception est qu'elle ne vous protège pas contre faire l'erreur de passer une chaîne au lieu d'une liste. Par exemple, si vous avez accidentellement convertir une chaîne à une liste et à la fin de la vérification à l'encontre de tous les caractères d'une chaîne, vous pourriez avoir un grand nombre de faux positifs.
Mais c'est mieux d'avoir un problème facile à résoudre que d'une solution qui est difficile à comprendre.
any()
ici, parce questr.endswith()
prend un ordre de terminaisons.if fn.endswith(included_extentensions)
est plus que suffisant.str.endswith(seq)
que Martijn l'a souligné, ce n'est pas correct, parce qu'un fichier a la fin avec.ext
pour cette extension. Ce code sera également trouver (par exemple) un fichier appelé "myjpg" ou dans un répertoire nommé simplement "png". Pour corriger, juste préfixe de chaque extension dansincluded_extensions
avec un.
.included_extensions
vsincluded_extentsions
? Dommage parce que sinon c'est mon préféré de réponse.Une autre option:
https://docs.python.org/3/library/fnmatch.html
glob
n'sur une seule ligne.glob
retourne le chemin d'accès complet, par opposition àos.listdir
simplement retourner le nom du fichier. Au moins ce est ce qui se passe en Python 2.Préliminaire du code
Solution 1 - utilisation "glob"
Solution 2 - utilisation "système d'exploitation" + "fnmatch"
Variante 2.1 de la Recherche dans le répertoire courant
Variante 2.2 de la Recherche récursive
Résultat
Solution 3 - utilisation "pathlib"
Notes:
https://docs.python.org/3.5/library/glob.html#glob.glob. Depuis ma machine est installé avec Python 3.4, je n'ai pas testé cela.
utiliser os.pied récursive de la liste de vos fichiers
file.endswith(alist_filter)
est assez.Filtre avec
glob
module:Importation glob
Wild Cards:
Fiter extension
.txt
:Un caractère unique
Nombre Varie
Alphabet Plages
vous aimerez peut-être aussi un plus haut niveau de l'approche (j'ai mis en œuvre et emballés comme findtools):
peut être installé avec
Cela vous donnera une liste de fichiers jpg avec leur chemin complet. Vous pouvez remplacer
x[0]+"/"+f
avecf
pour juste les noms de fichiers. Vous pouvez également remplacerf.endswith(".jpg")
avec chaã à condition que vous le souhaitez.Les noms de fichiers avec "jpg" et "png" extensions "chemin/vers/images":
Vous pouvez utiliser pathlib qui est disponible dans de la bibliothèque standard de Python 3.4 et au-dessus.
Vous pouvez définir le modèle et les vérifier. Ici j'ai pris de début et de fin de motif et de regarder pour eux dans le nom de fichier. FICHIERS contient la liste de tous les fichiers dans un répertoire.
Vous pouvez utiliser des sous-processus.check_ouput() comme
Bien sûr, la chaîne de caractères entre guillemets peut être quelque chose que vous voulez exécuter dans le shell, et le magasin de sortie.
ls
, la production ne devrait pas être analysée.