GNU/Linux >> Tutoriels Linux >  >> Linux

os.walk sans dossiers cachés

Je me rends compte que cela n'a pas été demandé dans la question, mais j'ai eu un problème similaire où je voulais exclure à la fois les fichiers cachés et les fichiers commençant par __ , plus précisément __pycache__ répertoires. J'ai atterri sur cette question parce que j'essayais de comprendre pourquoi ma compréhension de liste ne faisait pas ce que j'attendais. Je ne modifiais pas la liste en place avec dirnames[:] .

J'ai créé une liste de préfixes que je voulais exclure et j'ai modifié les noms de répertoire en place comme ceci :

    exclude_prefixes = ('__', '.')  # exclusion prefixes
    for dirpath, dirnames, filenames in os.walk(node):
        # exclude all dirs starting with exclude_prefixes
        dirnames[:] = [dirname
                       for dirname in dirnames
                       if not dirname.startswith(exclude_prefixes)]

Mon cas d'utilisation était similaire à celui d'OP, sauf que je voulais renvoyer le nombre total de sous-répertoires dans un certain dossier. Dans mon cas, je voulais omettre tous les sous-répertoires nommés .git (ainsi que tous les dossiers qui peuvent être imbriqués dans ces .git dossiers).

Dans Python 3.6.7, j'ai trouvé que l'approche de la réponse acceptée ne fonctionnait pas - elle comptait tous les .git dossier et leurs sous-dossiers. Voici ce qui a fonctionné pour moi :

num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
    if '.git' in dirs:
        dirs.remove('.git')
    num_local_subdir += (len(dirs))

Non, il n'y a pas d'option pour os.walk() cela sautera ceux-là. Vous devrez le faire vous-même (ce qui est assez simple) :

for root, dirs, files in os.walk(path):
    files = [f for f in files if not f[0] == '.']
    dirs[:] = [d for d in dirs if not d[0] == '.']
    # use files and dirs

Notez le dirs[:] = affectation de tranche ; os.walk parcourt récursivement les sous-répertoires listés dans dirs . En remplaçant les éléments de dirs avec ceux qui répondent à un critère (par exemple, les répertoires dont les noms ne commencent pas par . ), os.walk() ne visitera pas les répertoires qui ne répondent pas aux critères.

Cela ne fonctionne que si vous conservez le topdown argument de mot-clé à True , à partir de la documentation de os.walk() :

Quand topdown est True , l'appelant peut modifier la liste des noms de répertoire sur place (peut-être en utilisant del ou affectation de tranche) et walk() ne récursera que dans les sous-répertoires dont les noms restent dans dirnames; cela peut être utilisé pour élaguer la recherche, imposer un ordre de visite précis, ou encore pour renseigner walk() sur les répertoires que l'appelant crée ou renomme avant de reprendre walk() à nouveau.


Linux
  1. Coller les fichiers sans délimiteur ?

  2. Mv écrase le fichier en lecture seule sans invite ?

  3. Changer le mot de passe root par Sudo, sans Su ?

  4. Liste des répertoires sans barre oblique finale /

  5. cp -r sans fichiers cachés

Masquer les dossiers et afficher les fichiers cachés dans Ubuntu Linux [astuce pour débutant]

Comment voir les fichiers et dossiers cachés dans Debian

Comment afficher les fichiers et dossiers cachés dans le gestionnaire de fichiers Ubuntu

Comment masquer des fichiers et des dossiers dans le gestionnaire de fichiers sans les renommer

Comment compresser un dossier sous Linux

Installer emacs sans sudo ?