75 votes

Parcourir les fichiers et les sous-dossiers en Python

J'aimerais parcourir le dossier actuel et tous ses sous-dossiers et obtenir tous les fichiers portant l'extension .htm|.html. J'ai découvert qu'il est possible de savoir si un objet est un dir ou un fichier comme ceci :

import os

dirList = os.listdir("./") # current directory
for dir in dirList:
  if os.path.isdir(dir) == True:
    # I don't know how to get into this dir and do the same thing here
  else:
    # I got file and i can regexp if it is .htm|html

et à la fin, je voudrais avoir tous les fichiers et leurs chemins dans un tableau. Est-ce que cela est possible ?

0 votes

3 votes

Pourtant la réponse dans celui-ci est beaucoup plus courte et meilleure.

174voto

Sven Marnach Points 133943

Vous pouvez utiliser os.walk() pour itérer récursivement à travers un répertoire et tous ses sous-répertoires :

for root, dirs, files in os.walk(path):
    for name in files:
        if name.endswith((".html", ".htm")):
            # whatever

Pour construire une liste de ces noms, vous pouvez utiliser une compréhension de liste :

htmlfiles = [os.path.join(root, name)
             for root, dirs, files in os.walk(path)
             for name in files
             if name.endswith((".html", ".htm"))]

4 votes

Je pense que certaines nuances méritent d'être mentionnées, à savoir qu'il traverse/inclut des fichiers cachés et qu'il ne résout pas non plus les liens pour vous. Il n'est pas non plus garanti que chaque fichier/répertoire énuméré existe (principalement en raison du fait qu'un lien peut exister, mais pas sa cible). Quelques lectures complémentaires sur la résolution des liens pourrait être utile à certains, selon la façon dont vous avez l'intention d'utiliser os.walk .

18voto

Pragyaditya Das Points 747

J'avais une chose similaire à faire, et voici comment j'ai procédé.

import os

rootdir = os.getcwd()

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".html"):
            print (filepath)

J'espère que cela vous aidera.

1 votes

@Pragyaditya_Das, brillant !

9voto

Spas Points 92

En python 3, vous pouvez utiliser os.scandir() :

for i in os.scandir(path):
    if i.is_file():
        print('File: ' + i.path)
    elif i.is_dir():
        print('Folder: ' + i.path)

5voto

NeonJack Points 11

Utilisez newDirName = os.path.abspath(dir) pour créer un nom de chemin d'accès complet pour le sous-répertoire et ensuite lister son contenu comme vous l'avez fait avec le parent (i.e. newDirList = os.listDir(newDirName) )

Vous pouvez créer une méthode distincte de votre extrait de code et l'appeler de manière récursive à travers la structure des sous-répertoires. Le premier paramètre est le chemin d'accès au répertoire. Il sera modifié pour chaque sous-répertoire.

Cette réponse est basée sur la documentation de la version 3.1.1 de la bibliothèque Python. Il existe un bon exemple de ce modèle en action à la page 228 de la référence de la bibliothèque Python 3.1.1 (Chapitre 10 - Accès aux fichiers et aux répertoires). Bonne chance !

0voto

campervancoder Points 115

Version légèrement modifiée de la solution de Sven Marnach

import os

folder_location = 'C:\SomeFolderName'
file_list = create_file_list(folder_location)

def create_file_list(path):
    return_list = []

for filenames in os.walk(path):
    for file_list in filenames:
        for file_name in file_list:
            if file_name.endswith((".txt")):
                return_list.append(file_name)

return return_list

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X