IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

PermissionError: [WinError 5] Accès refusé [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut PermissionError: [WinError 5] Accès refusé
    Bonjour à tous,

    Je suis en train de m'entrainer à Python et j'ai un soucis sur un code que j'ai fait qui consiste à supprimer le contenu du dossier (fichier et sous dossiers).
    C'est un dossier que j'ai crée pour le test.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import glob, os
     
    # effacer tous les fichiers du dossier test
     
    for filename in glob.glob("C:\\MON REPERTOIRE"):
        os.remove(filename)
    Quand je lance le code j'ai ce message d'erreur : PermissionError: [WinError 5] Accès refusé

    J'ai essayé plusieurs scripts trouvé sur le net pour passer à travers mais ça ne fonctionne pas non plus.
    Déjà peut être que mon code n'est pas bon à la base.
    Vous avez une idée ?

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai essayé plusieurs scripts trouvé sur le net pour passer à travers mais ça ne fonctionne pas non plus. Déjà peut être que mon code n'est pas bon à la base.
    Lorsqu'on déballe un joujou de son carton, on commence par lire le mode d'emploi:
    os.remove(path, *, dir_fd=None)

    Remove (delete) the file path. If path is a directory, OSError is raised. Use rmdir() to remove directories.

    This function can support paths relative to directory descriptors.

    On Windows, attempting to remove a file that is in use causes an exception to be raised; on Unix, the directory entry is removed but the storage allocated to the file is not made available until the original file is no longer in use.
    This function is identical to unlink().
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Lorsqu'on déballe un joujou de son carton, on commence par lire le mode d'emploi:

    - W

    Salut wiztricks,

    Faut que je prenne cette habitude de regarder dans la doc, c'est pas encore un réflexe mais ça viendra !
    Effectivement avec votre lien tout devient plus clair déjà, mais je bloque encore dessus, quand je test avec j'ai un message d'erreur disant que le répertoire n'est pas vide. J'ai donc testé avec ça fonctionne mais à moitié, il supprime bien le contenu du dossier mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai donc testé avec ça fonctionne mais à moitié, il supprime bien le contenu du dossier mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.
    Dans ce cas, ce n'est plus la documentation qu'il faut regarder mais le source de rmtree dans le module shutil. Vous devriez pouvoir en faire un copier&coller et l'adapter pour qu'il ne détruise pas le répertoire parent (çà se passe à la fin).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour,

    Déjà, l'objectif a changé !

    avant :
    Citation Envoyé par Julianinho Voir le message
    ... qui consiste à supprimer le contenu du dossier (fichier et sous dossiers).
    maintenant :
    Citation Envoyé par Julianinho
    ... mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.

    Si je m'en tiens au dernier objectif, je déconseille l'utilisation de shutil.rmtree.
    Ca "sent à plein nez" le os.path.isdir couplé à un else et la récursivité pour ne détruire que les fichiers "réguliers".

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Dans ce cas, ce n'est plus la documentation qu'il faut regarder mais le source de rmtree dans le module shutil. Vous devriez pouvoir en faire un copier&coller et l'adapter pour qu'il ne détruise pas le répertoire parent (çà se passe à la fin).

    - W
    Ok merci je regarde ça ce soir et je vous tiens au courant si ça fonctionne !


    Citation Envoyé par plxpy Voir le message
    Bonjour,

    Déjà, l'objectif a changé !

    avant :


    maintenant :

    Si je m'en tiens au dernier objectif, je déconseille l'utilisation de shutil.rmtree.
    Ca "sent à plein nez" le os.path.isdir couplé à un else et la récursivité pour ne détruire que les fichiers "réguliers".
    Bonjour,

    L'objectif n'a pas changé, je souhaite toujours supprimer le contenu d'un dossier, c'est juste que je n'ai pas précisé dans mon 1er post que je ne souhaite pas supprimer le dossier parent (mais je pensais qu'on m'aurait tout de même compris en disant "supprimer le contenu d'un dossier", voila tout ^^).

    Sinon que me conseillez vous si vous me déconseillez l’utilisation de "shutil.rmtree".

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    J'ai essayé de récupérer le code sur le lien donné mais je n'arrive pas à le faire fonctionner, ça supprime toujours la totalité du dossier parent avec son contenu.

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure où c'est possible par le système de permission, il est plus simple d'accepter que le répertoire soit supprimé et de le recréer tout de suite après.

    Sinon: le dire parce que je dois avoir un petit code qui pourrait faire le boulot avec une petite adaptation.

    [Edit] finalement, c'est très simple: le code est donné dans la doc! => chercher os.walk

    Voilà le code adapté et commenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import os
     
    #############################################################################
    def efface_repertoire(repertoire):
        """efface le contenu d'un répertoire (fichiers, sous-répertoires)
           sans effacer le répertoire lui-même
           Attention: ne pas se tromper dans le répertoire donné! si on donne 
           '/' (unix) ou '\' (Windows), on efface tout le disque!!!
        """
        for rep, sreps, fics in os.walk(repertoire, topdown=False):
            # effacement des fichiers trouvés dans le répertoire rep
            for fic in fics:
                os.remove(os.path.join(rep, fic))
            # effacement des sous-répertoires trouvés dans le répertoire rep
            for srep in sreps:
                os.rmdir(os.path.join(rep, srep))
    L'astuce réside dans l'argument topdown=False parce que la suppression d'un répertoire n'est possible que s'il est vide. Cela impose que le parcours récursif le permette.

    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repertoire = r"E:\chemin\le_repertoire_a_effacer"
     
    efface_repertoire(repertoire)
    Ça a l'air de très bien marcher et d'être très rapide.

    Comme dit dans la doc et dans mon docstring, il ne faut pas se tromper dans le répertoire donné à la fonction, parce qu'il est facile de supprimer tout le disque...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Dans la mesure où c'est possible par le système de permission, il est plus simple d'accepter que le répertoire soit supprimé et de le recréer tout de suite après.

    Sinon: le dire parce que je dois avoir un petit code qui pourrait faire le boulot avec une petite adaptation.

    [Edit] finalement, c'est très simple: le code est donné dans la doc! => chercher os.walk

    Voilà le code adapté et commenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import os
     
    #############################################################################
    def efface_repertoire(repertoire):
        """efface le contenu d'un répertoire (fichiers, sous-répertoires)
           sans effacer le répertoire lui-même
           Attention: ne pas se tromper dans le répertoire donné! si on donne 
           '/' (unix) ou '\' (Windows), on efface tout le disque!!!
        """
        for rep, sreps, fics in os.walk(repertoire, topdown=False):
            # effacement des fichiers trouvés dans le répertoire rep
            for fic in fics:
                os.remove(os.path.join(rep, fic))
            # effacement des sous-répertoires trouvés dans le répertoire rep
            for srep in sreps:
                os.rmdir(os.path.join(rep, srep))
    L'astuce réside dans l'argument topdown=False parce que la suppression d'un répertoire n'est possible que s'il est vide. Cela impose que le parcours récursif le permette.

    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repertoire = r"E:\chemin\le_repertoire_a_effacer"
     
    efface_repertoire(repertoire)
    Ça a l'air de très bien marcher et d'être très rapide.

    Comme dit dans la doc et dans mon docstring, il ne faut pas se tromper dans le répertoire donné à la fonction, parce qu'il est facile de supprimer tout le disque...

    Bonjour Tyrtamos,

    Votre code fonctionne nickel, le dossier parent est conservé tout en supprimant le contenu (fichier et sous dossier), c'est exactement ce que je cherchais.
    Je vais juste méditer sur ce code là pour comprendre son fonctionnement.
    Merci pour votre aide !



    Citation Envoyé par wiztricks Voir le message
    Salut,

    ce code est le code de shutil.rmtree, si vous ne le modifiez pas pour que le répertoire de départ ne soit pas supprimé... çà ne fera pas plus ce que vous voulez.

    - W
    Je l'avais modifié pourtant pour l'adapter mais j'ai du mal m'y prendre,
    Pour être sûr que je cherche au bon endroit c'est bien ce code là qui nous intéresse ?
    J'ai un doute car chez moi il est plutôt au début/milieu de page, en revanche à la fin de page je n'ai rien trouvé.

    edit : même si le code de tyrtamos fonctionne parfaitement, je souhaiterais juste par curiosité et par envie d'apprendre savoir tout de même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    def rmtree(path, ignore_errors=False, onerror=None):
     
        """Recursively delete a directory tree.
     
     
        If ignore_errors is set, errors are ignored; otherwise, if onerror
     
        is set, it is called to handle the error with arguments (func,
     
        path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
     
        path is the argument to that function that caused it to fail; and
     
        exc_info is a tuple returned by sys.exc_info().  If ignore_errors
     
        is false and onerror is None, an exception is raised.
     
     
        """
     
        if ignore_errors:
     
            def onerror(*args):
     
                pass
     
        elif onerror is None:
     
            def onerror(*args):
     
                raise
     
        try:
     
            if os.path.islink(path):
     
                # symlinks to directories are forbidden, see bug #1669
     
                raise OSError("Cannot call rmtree on a symbolic link")
     
        except OSError:
     
            onerror(os.path.islink, path, sys.exc_info())
     
            # can't continue even if onerror hook returns
     
            return
     
        names = []
     
        try:
     
            names = os.listdir(path)
     
        except os.error, err:
     
            onerror(os.listdir, path, sys.exc_info())
     
        for name in names:
     
            fullname = os.path.join(path, name)
     
            try:
     
                mode = os.lstat(fullname).st_mode
     
            except os.error:
     
                mode = 0
     
            if stat.S_ISDIR(mode):
     
                rmtree(fullname, ignore_errors, onerror)
     
            else:
     
                try:
     
                    os.remove(fullname)
     
                except os.error, err:
     
                    onerror(os.remove, fullname, sys.exc_info())
     
        try:
     
            os.rmdir(path)
     
        except os.error:
     
            onerror(os.rmdir, path, sys.exc_info())

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai essayé de récupérer le code sur le lien donné mais je n'arrive pas à le faire fonctionner, ça supprime toujours la totalité du dossier parent avec son contenu.
    ce code est le code de shutil.rmtree, si vous ne le modifiez pas pour que le répertoire de départ ne soit pas supprimé... çà ne fera pas plus ce que vous voulez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2006, 23h42
  2. réseau local (accès refusé)
    Par le y@m's dans le forum Sécurité
    Réponses: 7
    Dernier message: 24/07/2005, 13h48
  3. [DCOM] Accès refusé au lancement du programme à distance
    Par raoulmania dans le forum Web & réseau
    Réponses: 7
    Dernier message: 22/06/2005, 13h01
  4. Kerio / Composants Indy / Accès refusé
    Par ixpe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/09/2004, 13h38
  5. acces refusé
    Par pram dans le forum XMLRAD
    Réponses: 3
    Dernier message: 02/04/2003, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo