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 :

créer un dossier


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Points : 15
    Points
    15
    Par défaut créer un dossier
    bonjour, je suis novice en python et je souhaiterais que mon programme puisse créer un dossier dans un répertoire spécifique mais qu'il le crée une seule fois et qu'à la prochaine ouverture il ne me fasse pas une erreur.
    j'ai essayé avec la commande mkdir, cela fonctionne mais la prochaine fois que j'ouvre mon programme il m'indique que le dossier et déjà créé.

    Donc je vois pas comment faire, est ce que quelqu'un peut m'aider svp!

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Pourquoi ne pas rattraper l'erreur tout simplement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    try:
        os.mkdir(...)
    except OSError:
        pass

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Points : 15
    Points
    15
    Par défaut créer un dossier
    merci beaucoup sa à l'air de marcher!!!super

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    encore désolé mais maintenant je souhaiterai utiliser un raccourcie, par exemple le raccourcie où se trouve mon programme mais sans taper ce raccourcie?
    Comment je pourrais faire?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Plutôt que de générer une erreur à chaque fois, pourquoi ne pas simplement tester avant si le répertoire existe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
     
    if not os.path.exists(chemin):    #Tu remplaces chemin par le chemin complet
        os.mkdir(chemin)

    Pour ton autre question, je n'ai pas très bien compris ce que tu voulais et je doute pouvoir te répondre.

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    "Taper un raccourci" , ça veut dire quoi ?

    Je ne sais pas si ça répondra à ton problème: perso j'ai crée, dans la barre de lancement, un Raccourci d'un programme que je lance souvent.
    La barre de lancement est en bas à gauche, à coté de Start (je suis sous Windows).
    Clic droit sur l'icône du programme en maintenant appuyé, tirer l'icône jusqu'à la barre de lancement, une fois dans la barre de lancement relacher le doigt et cliquer sur Créer un Raccourci.

  7. #7
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par Helios07 Voir le message
    Plutôt que de générer une erreur à chaque fois, pourquoi ne pas simplement tester avant si le répertoire existe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
     
    if not os.path.exists(chemin):    #Tu remplaces chemin par le chemin complet
        os.mkdir(chemin)

    Pour ton autre question, je n'ai pas très bien compris ce que tu voulais et je doute pouvoir te répondre.
    Mauvais code, tu as une "race condition": si entre le temps que os.path.exists() te donne ta réponse et ton os.mkdir(), un autre processus/utilisateur pourrait avoir créer le dossier et tu vas donc avoir une exception. C'est mieux de juste essayer de créer le dossier et de rattraper l'erreur.

    Il est préférable de demander pardon que de demander la permission.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    En fait, l'idéal serait de faire le test d'existence, mais après, et si possible de garder en mémoire l'erreur, qui pourrait ne pas être due à l'existence du répertoire, mais par exemple à un problème de permissions, etc.

  9. #9
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par oiffrig Voir le message
    En fait, l'idéal serait de faire le test d'existence, mais après, et si possible de garder en mémoire l'erreur, qui pourrait ne pas être due à l'existence du répertoire, mais par exemple à un problème de permissions, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    >>> try:
    ...   os.mkdir('/akshdkasjhdkashk')
    ... except OSError, e:
    ...   print e.errno, e.strerror, e.filename
    ...
    13 Permission denied /akshdkasjhdkashk
     
    >>> try:
    ...   os.mkdir('src')
    ... except OSError, e:
    ...   print e.errno, e.strerror, e.filename
    ...
    17 File exists src
    L'exception va te dire pourquoi ça pas marché.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Le sujet est inactif depuis un petit moment mais je l'ai consulté lors de recherche pour coder un script d'automatisation et j'ai trouvé une solution différente qui me parait plutôt bonne et simple j'aimerais vous la proposer et éventuellement avoir vos avis et critiques.

    Le code :

    if os.path.isdir(chemin) is Flase:
    ...os.mkdir(chemin)

    Merci

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Leski Voir le message
    ...et éventuellement avoir vos avis et critiques
    Dans le code proposé, on évite de créer un répertoire qui existe déjà, mais le programme se plantera quand même s'il n'existe pas mais qu'on n'a pas des droits suffisants pour le créer dans le répertoire parent. Par exemple sous Linux si l'utilisateur n'a pas les droits d'écriture sur le répertoire parent: c'est le cas général des répertoires système.

    Peut-être faudrait-il simplement entourer les 2 lignes proposées par un simple try:... except:... pour récupérer et traiter les autres difficultés.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Leski Voir le message
    if os.path.isdir(chemin) is Flase:
    ...os.mkdir(chemin)
    Le code en question plantera si un fichier a le ^m nom que le répertoire que tu veux créer.
    Le "bon" code a déjà été cité précédemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        os.mkdir(path)
    except OSError:
        pass

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut os.path.makedirs(name, mode=mode, os.path.exists(name))
    Salut,

    Ce sujet est un "rat hole" (trou à rat) ou un "catch-22" (attrape mouches).
    Car si le "fonctionnel" est à la base relativement simple, le "contexte" de son application en fait un fourre-tout.

    Le sujet pourrait se résumer à la définition d'une fonction nommée: "create_dir_if_not_exists".

    C'est un "rat hole" car un répertoire est un objet persistant. Vivant sa vie après l'exécution du programme, il aura les propriétés attendues juste après sa création. Lorsqu'il existe déjà (et c'est le cas "normal"), il faudra en "pré-requis", s'assurer de son état avant d'imaginer pouvoir penser à s'en servir.
    La liste des pré-requis devant être adaptée à un contexte, ce sera toujours trop ou pas assez.

    A minima, c'est une "variation" sur mkdir, pourquoi ne pas oser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os
    def my_mkdir(name):
         if not os.path.exists(name):
              os.mkdir(name)
         assert os.path.isdir(name))
    La création conditionnelle du répertoire est réalisée "à la lettre".
    Dans tous les cas, on s'assure que le pré-requis "est un répertoire" est "satisfait". Charge à l'appelant de se débrouiller avec les éventuelles exceptions.
    Note: remonter ou pas des erreurs "précises" dépendra de la capacité de l'appelant à les gérer... ou de la nécessité d'afficher des messages "clairs" à la place de la seule trace de l'exception (exigences louables côté maintenabilité, support des utilisateurs mais décalées par rapport au fonctionnel au "business" d'un create if not exists).

    Cela ne traite pas le cas où plusieurs instances de l'application pourraient créer le répertoire en même temps.
    Mais dans ce cas, est-il raisonnable d'essayer de créer le répertoire? L'utilisateur pouvant ne pas avoir les bons droits pour le créer "proprement", il sera souvent préférable de s'en remettre à l'administrateur système. Dans ce cas, os.path.is_dir(name) pourrait être largement suffisant. Mais ici c'est pour le fun du passage d'une suite d'instruction en séquence à un try/catch.

    Traiter cette exigence passe par attraper les exceptions retournées par mkdir et filtrer (ne pas remonter) celles correspondant à ce cas là.
    Pour les autres, c'est toujours le problème de l'appelant!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import os
    import errno
    def my_mkdir(name):
         if not os.path.exists(name):
              try:
                  os.mkdir(name)
              except OSError as e:
                  if e.errno != errno.EEXIST:
                       raise
         assert os.path.isdir(name))
    A la relecture, on pourra "simplifier" le code (moins de lignes) en regardant ce qui tombe du mkdir plutôt que de se poser des questions avant et après...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import os
    import errno
    def my_mkdir(name):
         try:
             os.mkdir(name)
         except OSError as e:
             if not (e.errno == errno.EEXIST and os.path.isdir(name)):
                 raise
    De fait, c'est moins lisible! Il faudra certainement remplacer le code retiré par des commentaires.

    Python 3.2 a ajouté le paramètre exist_ok à la fonction os.makedirs qui permet d'en faire plus avec encore moins de lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    def my_mkdir(name, mode=0o777):
        os.path.makedirs(name, mode, os.path.exists(name))
    Encore plus opaque, mais plus besoin de documenter!

    Cordialement,

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

Discussions similaires

  1. Créer un dossier via une commande PHP
    Par budylove dans le forum Langage
    Réponses: 2
    Dernier message: 27/04/2006, 13h45
  2. Réponses: 2
    Dernier message: 20/01/2006, 17h08
  3. PL/Sql comment créer un dossier...
    Par miklkl dans le forum PL/SQL
    Réponses: 11
    Dernier message: 26/10/2005, 16h37
  4. Comment créer un dossier ?
    Par Bouguennec dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 11h15
  5. Créer un dossier sur serveur distant
    Par TorÕ02 dans le forum C++
    Réponses: 7
    Dernier message: 11/10/2004, 17h30

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