Liste Python répertoire, sous-répertoire et des fichiers
Je suis en train de faire un script pour lister tous les répertoire, sous-répertoire et des fichiers dans un répertoire donné.
J'ai essayé ceci:
import sys,os
root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")
for r,d,f in os.walk(path):
for file in f:
print os.path.join(root,file)
Malheureusement il ne fonctionne pas correctement.
J'ai tous les fichiers, mais pas de leurs chemins d'accès complets.
Par exemple, si la dir struct serait:
/home/patate/directory/targetdirectory/123/456/789/file.txt
Il serait d'impression:
/home/patate/directory/targetdirectory/file.txt
Ce dont j'ai besoin est le premier résultat. Toute aide serait grandement appréciée! Merci.
- Évitez d'utiliser "fichier" comme un nom de variable comme c'est un type en Python.
- l'utilisation de 'r' au lieu de 'root' dans votre dernière ligne!!!
Vous devez vous connecter pour publier un commentaire.
Utilisation
os.path.join
pour concaténer les répertoire et fichier nom:Remarque l'utilisation de
path
et pasroot
dans la concaténation, puisque l'utilisation deroot
serait incorrect.En Python 3.4, la pathlib module a été ajouté pour faciliter le chemin de manipulations. Donc, l'équivalent de
os.path.join
serait:L'avantage de
pathlib
est que vous pouvez utiliser une variété de méthodes utiles sur les chemins. Si vous utilisez le bétonPath
variante, vous pouvez également faire de vraies OS appels à travers eux, comme chanding dans un répertoire, la suppression du chemin d'accès, ouverture du fichier de points et beaucoup plus.Juste au cas où... Obtenir tous les fichiers dans le répertoire et sous-répertoires correspondant à certains modèle (*.py, par exemple):
Ici est un one-liner:
Plus à l'extérieur
val for sublist in ...
boucle aplatit la liste pour être unidimensionnel. Lej
boucle recueille une liste de tous les fichiers basename et l'ajoute au chemin courant. Enfin, lai
boucle itère sur tous les répertoires et sous répertoires.Cet exemple utilise la codées en dur chemin
./
dans leos.à pied(...)
appel, vous pouvez compléter n'importe quel chemin la chaîne que vous souhaitez.Remarque:
os.chemin d'accès.expanduser
et/ouos.chemin d'accès.expandvars
peut être utilisé pour les chemins des chaînes de caractères comme~/
L'extension de cet exemple:
Il est facile d'ajouter dans le fichier basename tests et nom_répertoire tests.
Par Exemple, le test de
*.jpg
fichiers:En outre, à l'exclusion de la
.git
répertoire:not
après laif
?os.walk
sur un manuel dirlisting boucle, les générateurs sont grands, allez les utiliser.Vous devez utiliser 'r' dans votre joindre au lieu de 'root'
Ne pouvais pas le commentaire, donc écrire la réponse ici. C'est la plus claire une ligne, j'ai vu:
Vous pouvez prendre un coup d'oeil à cet exemple que j'ai fait. Il utilise le système d'exploitation.chemin d'accès.promenade d'une fonction qui est obsolète, méfiez-vous.Utilise une liste pour stocker tous les filepaths
Un peu plus simple one-liner:
Puisque chaque exemple ici est seulement à l'aide de
walk
(avecjoin
), j'aimerais vous montrer un bel exemple et de comparaison avec leslistdir
:Donc, comme vous pouvez le voir par vous-même, la
listdir
version est beaucoup plus efficace. (et quejoin
est lent)