3467 votes

Comment puis-je répertorier tous les fichiers d'un répertoire ?

Comment puis-je répertorier tous les fichiers d'un répertoire en Python et les ajouter à une liste?

27 votes

6226voto

pycruft Points 8095

os.listdir() retourne tout ce qui se trouve à l'intérieur d'un répertoire -- y compris à la fois les fichiers et les répertoires.

os.path's isfile() peut être utilisé pour lister uniquement les fichiers :

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

Alternativement, os.walk() renvoie deux listes pour chaque répertoire qu'il visite -- une pour les fichiers et une pour les répertoires. Si vous souhaitez uniquement le répertoire racine, vous pouvez arrêter la première fois qu'il renvoie :

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

ou, plus court :

from os import walk

filenames = next(walk(mypath), (None, None, []))[2]  # [] if no file

114 votes

Un peu plus simple : (_, _, noms_fichiers) = walk(monchemin).next() (si vous êtes sûr que la fonction walk renverra au moins une valeur, ce qui devrait être le cas).

11 votes

Légère modification pour stocker les chemins complets : pour (dirpath, dirnames, filenames) in os.walk(mypath) : checksum_files.extend(os.path.join(dirpath, filename) for filename in filenames) break

177 votes

f.extend(filenames) n'est pas réellement équivalent à f = f + filenames. extend va modifier f sur place, alors que l'ajout crée une nouvelle liste dans un nouvel emplacement mémoire. Cela signifie que extend est généralement plus efficace que +, mais cela peut parfois prêter à confusion si plusieurs objets détiennent des références à la liste. Enfin, il convient de noter que f += filenames est équivalent à f.extend(filenames), pas à f = f + filenames.

2476voto

adamk Points 9991

Je préfère utiliser le module glob, car il fait correspondance de motifs et d'expansion.

import glob
print(glob.glob("/home/adam/*"))

Il fait correspondance de motifs de manière intuitive

import glob
# Tous les fichiers et répertoires se terminant par .txt et ne commençant pas par un point :
print(glob.glob("/home/adam/*.txt")) 
# Tous les fichiers et répertoires se terminant par .txt avec une profondeur de 2 dossiers, en ignorant les noms commençant par un point :
print(glob.glob("/home/adam/*/*.txt")) 

Il renverra une liste avec les fichiers et répertoires interrogés :

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

Remarquez que glob ignore les fichiers et répertoires commençant par un point ., car ils sont considérés comme des fichiers et répertoires cachés, sauf si le motif est quelque chose comme .*.

Utilisez glob.escape pour échapper les chaînes qui ne sont pas censées être des motifs :

print(glob.glob(glob.escape(nom_dossier) + "/*.txt"))

19 votes

C'est un raccourci pour listdir + fnmatch docs.python.org/library/fnmatch.html#fnmatch.fnmatch

48 votes

Pour clarifier, cela ne retourne pas le "chemin complet"; cela renvoie simplement l'expansion du glob, quoi qu'il en soit. Par exemple, étant donné /home/user/foo/bar/hello.txt, alors, si vous exécutez dans le répertoire foo, le glob("bar/*.txt") renverra bar/hello.txt. Il existe des cas où vous voulez en fait le chemin complet (c'est-à-dire absolu); pour ces cas, consultez stackoverflow.com/questions/51520/…

1 votes

Lié : trouver des fichiers de manière récursive avec glob : stackoverflow.com/a/2186565/4561887

978voto

sepp2k Points 157757
import os
os.listdir("somedirectory")

retournera une liste de tous les fichiers et répertoires dans "somedirectory".

12 votes

Cela renvoie le chemin relatif des fichiers, par rapport au chemin complet retourné par glob.glob

25 votes

@JIXiang: os.listdir() renvoie toujours noms de fichiers (pas de chemins relatifs). Ce que glob.glob() renvoie est déterminé par le format du chemin du motif d'entrée.

190voto

Remi Points 4223

Une solution en une ligne pour obtenir seulement la liste des fichiers (pas de sous-dossiers) :

filenames = next(os.walk(path))[2]

ou les chemins absolus :

paths = [os.path.join(path, fn) for fn in next(os.walk(path))[2]]

7 votes

Seulement une ligne si vous avez déjà importé os. Me semble moins concis que glob().

4 votes

Le problème avec glob est qu'un dossier appelé 'something.something' serait renvoyé par glob('/home/adam/*.*')

6 votes

Sur OS X, il y a quelque chose appelé un bundle. C'est un répertoire qui devrait généralement être traité comme un fichier (comme un .tar). Voulez-vous qu'ils soient traités comme un fichier ou un répertoire? En utilisant glob(), cela les traiterait comme un fichier. Votre méthode les traiterait comme un répertoire.

158voto

Johnny Points 126

Obtenir les chemins complets des fichiers à partir d'un répertoire et de tous ses sous-répertoires

import os

def get_filepaths(directory):
    """
    Cette fonction générera les noms de fichiers dans un répertoire 
    arborescent en parcourant l'arborescence soit de haut en bas, soit de bas en haut. Pour chaque
    répertoire dans l'arborescence, enraciné dans le répertoire de départ (y compris le répertoire de départ lui-même),
    elle renvoie un 3-uplet (chemin_du_répertoire, noms_des_répertoires, noms_des_fichiers).
    """
    file_paths = []  # Liste qui stockera tous les chemins complets des fichiers.

    # Parcourez l'arborescence.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Joindre les deux chaînes afin de former le chemin complet du fichier.
            chemin_fichier = os.path.join(root, filename)
            file_paths.append(chemin_fichier)  # Ajoutez-le à la liste.

    return file_paths  # Auto-explicatif.

# Exécutez la fonction ci-dessus et enregistrez ses résultats dans une variable.
chemins_complets_des_fichiers = get_filepaths("/Users/johnny/Desktop/TEST")

  • Le chemin que j'ai fourni dans la fonction ci-dessus contenait 3 fichiers— deux d'entre eux dans le répertoire racine, et un autre dans un sous-dossier appelé "SOUS_DOSSIER." Vous pouvez maintenant faire des choses comme:
  • print full_file_paths qui affichera la liste:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

Si vous le souhaitez, vous pouvez ouvrir et lire le contenu, ou vous concentrer uniquement sur les fichiers avec l'extension ".dat" comme dans le code ci-dessous:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat

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