web-dev-qa-db-fra.com

Comment vérifier si un dossier contient des fichiers en utilisant python 3

J'ai cherché partout cette réponse mais je ne la trouve pas.

J'essaie de trouver un script qui recherchera un sous-dossier particulier puis vérifiera s'il contient des fichiers et, si oui, écrit le chemin du dossier. J'ai compris la partie de recherche de sous-dossier, mais la vérification des fichiers me bloque.

J'ai trouvé plusieurs suggestions sur la façon de vérifier si un dossier est vide, et j'ai essayé de modifier les scripts pour vérifier si le dossier n'est pas vide, mais je n'obtiens pas les bons résultats.

Voici le script le plus proche:

for dirpath, dirnames, files in os.walk('.'):
if os.listdir(dirpath)==[]:
    print(dirpath)

Cela listera tous les sous-dossiers qui sont vides, mais si j'essaye de le changer en:

if os.listdir(dirpath)!=[]:
    print(dirpath)

il répertorie tout - pas seulement les sous-dossiers contenant des fichiers.

J'apprécierais vraiment que quelqu'un puisse m'orienter dans la bonne direction.

C'est pour Python 3.4, si cela importe.

Merci pour toute l'aide que tu peux m'apporter.

26
Heather

"fichiers" vous indique déjà ce qui se trouve dans le répertoire. Il suffit de le vérifier:

for dirpath, dirnames, files in os.walk('.'):
    if files:
        print(dirpath, 'has files')
    if not files:
        print(dirpath, 'is empty')
23
tdelaney

Vous pouvez utiliser la nouvelle bibliothèque pathlib introduite dans Python 3.4 pour extraire récursivement tous les sous-répertoires non vides, par exemple:

import pathlib

root = pathlib.Path('some/path/here')
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()}

Puisque vous devez de toute façon parcourir l'arborescence, nous construisons un ensemble de répertoires parents où un fichier est présent, ce qui donne un ensemble de répertoires contenant des fichiers - puis faites ce que vous voulez avec le résultat.

9
Jon Clements

Si vous pouvez supprimer le répertoire, vous pouvez utiliser ceci:

try:
    os.rmdir( submodule_absolute_path )
    is_empty = True

except OSError:
    is_empty = False

if is_empty:
    pass

os.rmdir ne supprime un répertoire que s'il est vide, sinon il lève l'exception OSError.

Vous pouvez trouver une discussion à ce sujet sur:

  1. https://bytes.com/topic/python/answers/157394-how-determine-if-folder-empty

Par exemple, la suppression d'un répertoire vide est très bien lorsque vous prévoyez de faire un clone git, mais pas si vous vérifiez au préalable si le répertoire est vide, de sorte que votre programme ne génère pas d'erreur de répertoire vide.

4
user
entities = os.listdir(dirpath)
for entity in entities:
    if os.path.isfile(entity):
        print(dirpath)
        break
4
ventsyv

En ajoutant à la réponse pathlib de @Jon Clements, je voulais vérifier si le dossier est vide avec pathlib mais sans créer un ensemble:

from pathlib import Path

is_empty = not bool(sorted(Path('some/path/here').rglob('*')))

sorted (Path (path_here) .rglob ('*')) renvoie une liste d'éléments PosixPah triés. S'il n'y a aucun élément, il renvoie une liste vide, qui est False. Donc is_empty sera True si le chemin est vide et false si le chemin a quelque chose

Des résultats d'idées similaires {} et [] donnent la même chose: enter image description here

3
Prayson W. Daniel

Vous pouvez utiliser ce code simple:

dir_contents = [x for x in os.listdir('.') if not x.startswith('.')]
if len(dir_contents) > 0:
    print("Directory contains files")

Il vérifie les fichiers et répertoires dans le répertoire de travail actuel (.). Vous pouvez modifier . Dans os.listdir() pour vérifier tout autre répertoire.

2
Ammar Alyousfi