J'ai besoin d'un marcheur de système de fichiers que je pourrais demander d'ignorer en parcourant les répertoires que je veux laisser intacts, y compris tous les sous-répertoires sous cette branche. os.walk et os.path.walk ne le font pas.Un marcheur Python qui peut ignorer les répertoires
Répondre
donc j'ai fait cette maison-rôles fonction Walker:
import os
from os.path import join, isdir, islink, isfile
def mywalk(top, topdown=True, onerror=None, ignore_list=('.ignore',)):
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = os.listdir(top)
except Exception, err:
if onerror is not None:
onerror(err)
return
if len([1 for x in names if x in ignore_list]):
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
path = join(top, name)
if not islink(path):
for x in mywalk(path, topdown, onerror, ignore_list):
yield x
if not topdown:
yield top, dirs, nondirs
Il est possible de modifier le deuxième élément des valeurs de retour de os.walk
en place:
[...] l'appelant peut modifier la liste des noms de répertoire sur place (en utilisant peut-être une affectation del ou slice), et walk() ne se recurdera que dans les sous-répertoires dont les noms restent dans les noms de répertoire; cela peut être utilisé pour élaguer la recherche [...]
def fwalk(root, predicate):
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if predicate(r, d)]
yield dirpath, dirnames, filenames
Maintenant, vous pouvez simplement la main dans un prédicat pour les sous-répertoires:
>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
En fait, os.walk
peut faire exactement ce que vous voulez . Dites que j'ai une liste (peut-être un ensemble) de répertoires à ignorer dans ignore
. Alors cela devrait fonctionner:
def my_walk(top_dir, ignore):
for dirpath, dirnames, filenames in os.walk(top_dir):
dirnames[:] = [
dn for dn in dirnames
if os.path.join(dirpath, dn) not in ignore ]
yield dirpath, dirnames, filenames
Voici la solution la meilleure et la plus simple. N'oubliez pas que si vous supprimez le nom de dossier des répertoires, il ne sera pas exploré par os.walk. J'ai espéré que ça aide
- 1. Git: Comment ignorer les répertoires correspondants dans un sous-répertoire?
- 2. Syntaxe .hgignore pour ignorer uniquement les fichiers, pas les répertoires?
- 3. vérifier les permissions des répertoires en python
- 4. Outil de comparaison XML qui peut "Tidy" le XML et ignorer les différences dans les attributs
- 5. Est-il possible d'utiliser un module python qui n'est pas installé dans les répertoires python de Linux?
- 6. Est-ce que awk peut ignorer les fichiers qui n'existent pas, sans race?
- 7. Comment ignorer un enregistrement qui ne peut pas être inséré dans vb.net
- 8. Comment obtenir tous les sous-répertoires immédiats en Python
- 9. SQL Reporting Services ne peut pas configurer les répertoires virtuels
- 10. Packages Python et répertoires egg-info
- 11. récursive CVS ajouter des fichiers/répertoires et ignorer les fichiers existants CVS
- 12. Pourquoi webmin ne peut-il pas ouvrir les fichiers dans les répertoires qui ne sont pas exécutables dans le monde?
- 13. Pourquoi Python ne trouve-t-il pas les objets partagés qui se trouvent dans les répertoires de sys.path?
- 14. Comparez l'outil qui peut masquer les différences?
- 15. Impossible d'exclure les répertoires de PHPDocumentor
- 16. Ignorer les espaces blancs
- 17. Ignorer les avertissements en permanence
- 18. Supprimer tous les répertoires dans une archive FTP qui ont un certain nom en utilisant PHP
- 19. Trouver tous les fichiers dans un répertoire qui ne sont pas eux-mêmes des répertoires
- 20. Existe-t-il un moyen d'obtenir tous les répertoires mais pas les fichiers dans un répertoire en Python?
- 21. Est-ce que .cvsignore peut exclure les modèles trouvés dans les sous-répertoires récursifs?
- 22. Ignorer les fichiers générés automatiquement par Emacs dans un diff
- 23. SQL Import ignorer les doublons
- 24. Est-ce que pydoc peut générer des sous-répertoires?
- 25. Actionscript 3.0: affichage de l'objet marcheur en mode strict
- 26. Masquer les répertoires dans wxGenericDirCtrl
- 27. Répertorier les répertoires et les fichiers PHP
- 28. Comment regex peut-il ignorer les guillemets échappés lors de la recherche de chaînes?
- 29. Pour boucle ignorant les répertoires avec un espace dans les?
- 30. comment ignorer les définitions (VS2008)
J'ai quelque peu oublié l'attribution de tranches, j'ai pris la liberté d'ajouter cela à mon code. –
C'est la manière attendue de le faire, même dans la documentation de os.path.walk(). – unwind
Non, je veux dire l'assignation de tranches entières comme un moyen de modifier la liste entière, pas le fait que vous pouvez le changer. –