Je travaille sur un script pour parcourir de manière récursive les sous-dossiers d'un dossier principal et créer une liste à partir d'un certain type de fichier. J'ai un problème avec le script. Il est actuellement défini comme suit
for root, subFolder, files in os.walk(PATH):
for item in files:
if item.endswith(".txt") :
fileNamePath = str(os.path.join(root,subFolder,item))
le problème est que la variable subFolder extrait une liste de sous-dossiers plutôt que le dossier dans lequel se trouve le fichier ITEM. Je pensais exécuter une boucle for pour le sous-dossier avant et rejoindre la première partie du chemin, mais j'ai pensé que je vérifiais deux fois si quelqu'un avait des suggestions avant cela. Merci de votre aide!
rglob
est insensible sur les plates-formes Windows - mais il n'est pas insensible au portage.glob
aussi avec (Python 3.6 ici):glob.iglob(os.path.join(real_source_path, '**', '*.[xX][mM][lL]')
iglob
ne fonctionne pas pour les fichiers dans les sous-sous-sous-dossiers ou ci-dessous. Vous devez ajouterrecursive=True
.glob.glob()
a un nouveau paramètre récursif .Si vous souhaitez récupérer tous les
.txt
fichiers sousmy_path
(y compris récursivement les sous- répertoires):Si vous avez besoin d'un itérateur, vous pouvez utiliser iglob comme alternative:
la source
files = glob.glob(PATH + '/*/**/*.txt', recursive=True)
?Je vais traduire la compréhension de la liste de John La Rooy en for imbriquée, juste au cas où quelqu'un d'autre aurait du mal à la comprendre.
Doit être équivalent à:
Voici la documentation pour la compréhension de liste et les fonctions os.walk et glob.glob .
la source
glob.glob(..., recursive=True)
etlist(Path(dir).glob(...'))
non.Cela semble être la solution la plus rapide que je pourrais trouver, et est plus rapide
os.walk
et beaucoup plus rapide que n'importe quelleglob
solution .f.path
enf.name
(ne le changez pas pour les sous-dossiers!).Args:
dir: str, ext: list
.La fonction renvoie deux listes:
subfolders, files
.Voir ci-dessous pour une analyse détaillée de la vitesse.
Analyse de la vitesse
pour diverses méthodes pour obtenir tous les fichiers avec une extension de fichier spécifique dans tous les sous-dossiers et le dossier principal.
tl; dr:
-
fast_scandir
gagne clairement et est deux fois plus rapide que toutes les autres solutions, sauf os.walk.-
os.walk
est la deuxième place légèrement plus lente.- l'utilisation
glob
ralentira considérablement le processus.- Aucun des résultats n'utilise le tri naturel . Cela signifie que les résultats seront triés comme suit: 1, 10, 2. Pour obtenir un tri naturel (1, 2, 10), veuillez consulter https://stackoverflow.com/a/48030307/2441026
Résultats:
Les tests ont été réalisés avec W7x64, Python 3.8.1, 20 exécutions. 16596 fichiers dans 439 sous-dossiers (partiellement imbriqués).
find_files
provient de https://stackoverflow.com/a/45646357/2441026 et vous permet de rechercher plusieurs extensions.fast_scandir
a été écrit par moi-même et renverra également une liste de sous-dossiers. Vous pouvez lui donner une liste d'extensions à rechercher (j'ai testé une liste avec une entrée à une simpleif ... == ".jpg"
et il n'y avait pas de différence significative).la source
La nouvelle
pathlib
bibliothèque simplifie cela à une ligne:Vous pouvez également utiliser la version générateur:
Cela renvoie des
Path
objets, que vous pouvez utiliser pour à peu près n'importe quoi, ou obtenir le nom du fichier sous forme de chaîne parfile.name
.la source
Ce n'est pas la réponse la plus pythonique, mais je vais la mettre ici pour le plaisir car c'est une belle leçon de récursivité
Sur ma machine, j'ai deux dossiers
root
etroot2
Disons que je veux trouver tous
.txt
les.mid
fichiers dans l'un ou l'autre de ces répertoires, alors je peux simplement fairela source
Le récursif est nouveau dans Python 3.5, il ne fonctionnera donc pas sur Python 2.7. Voici l'exemple qui utilise des
r
chaînes, il vous suffit donc de fournir le chemin tel quel sur Win, Lin, ...Remarque: il répertorie tous les fichiers, quelle que soit leur profondeur.
la source
Vous pouvez le faire de cette façon pour vous renvoyer une liste de fichiers de chemin absolus.
la source
Si cela ne vous dérange pas d'installer une bibliothèque d'éclairage supplémentaire, vous pouvez le faire:
Usage:
Le résultat devrait ressembler à ceci:
Cela fonctionne à la fois sur Python 2.7 et Python 3.
Github: https://github.com/kyzas/plazy#list-files
Avertissement: je suis un auteur de
plazy
.la source
Cette fonction mettra récursivement uniquement les fichiers dans une liste. J'espère que ce sera vous.
la source
Votre solution d'origine était presque correcte, mais la variable «racine» est mise à jour dynamiquement car elle se déplace de manière récursive. os.walk () est un générateur récursif. Chaque ensemble de tuples de (racine, sous-dossier, fichiers) est destiné à une racine spécifique telle que vous l'avez configurée.
c'est à dire
J'ai légèrement modifié votre code pour imprimer une liste complète.
J'espère que cela t'aides!
la source