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 :

Copie de fichiers dans divers dossiers.


Sujet :

Python

  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 213
    Billets dans le blog
    1
    Par défaut Copie de fichiers dans divers dossiers.
    Bonjour.
    Je suis complètement dépassé Je pratique peu Python et bien souvent je bute sur des éléments "de base".

    Mon problème sous Debian 11 - Python 3.9.16 64-bit | Qt 5.15.6 | PyQt5 5.15.7 | Linux 5.10.0-23-amd64 - Spyder :

    Dans un dossier "DossierPrincipal", il y a plusieurs fichiers (fichier1.odt, .... fichier5.odt) que je voudrais copier dans des sous-dossiers.
    Je crée les sous-dossiers en question dans mon dossier courant (sousDossier1, ... sousDossier4).

    Jusque là, pas de problème. Ça fonctionne.

    Maintenant, je veux copier un premier fichier1.odt dans mon premier sous-dossier.
    Et là, l'adresse du "DossierPrincipal" est très longue.
    J'essaie d'enregistrer cette adresse dans une variable, et ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossierPrincipal = (os.getcwd())
    Maintenant, au départ de ce dossier, je voudrais copier le fichier1.odt dans le sousDossier1, le fichier2.odt dans le sousDossier2, ...

    Je n'arrive pas à indiquer l'adresse de destination de la copie sans quitter le dossierPrincipal avec la commande
    Merci de m'aider à m'y retrouver.
    A+

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 686
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    salut,

    je vais prêcher pour ma paroisse : pourquoi ne pas faire ça en shell, puisque de toute façon tu demandes à Python de le faire en sh (si je comprends bien) ?
    ce serait tellmeent plus direct, et plus simple, ne serait-ce qu'à debugguer.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 308
    Par défaut
    Salut,

    Il faut donner les deux chemins en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    shutil.copy(origin, destination)
    Il s'agit bien de créer une copie ? Si c'est pour déplacer le fichier in faut utiliser shutil.move(origin, destination).

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Papy Octet Voir le message
    Dans un dossier "DossierPrincipal", il y a plusieurs fichiers (fichier1.odt, .... fichier5.odt) que je voudrais copier dans des sous-dossiers.
    C'est vrai que la remarque de N_BaH est assez logique. Tu es sous Debian, tu as accès au shell, pas super compliqué de taper cp fichier1.odt sousDossier1 et la suite. Python est un chouette langage mais il n'a pas été spécifiquement optimisé pour te permettre de lui indiquer simplement comment faire des trucs qu'on fait déjà classiquement en shell.
    Accessoirement il y a un détail que tu n'as pas cité: est-ce un besoin ponctuel ou bien répétitif? Parce qu'une fois que les fichiers sont copiés il ne devrait pas avoir nécessairement besoin de les recopier tous les 4 matin. Ou alors il s'agit d'une sauvegarde et là on entre dans une autre problématique.
    Accessoirement pour copier "facilement" les fichiers 1, 2, 3, etc dans des dossiers 1, 2, 3, etc en shell c'est aussi assez faisable...
    for i in $(seq 10); do cp "fichier$i.odt" "dossier$i" && echo "fichier$i copié"; done...

    Citation Envoyé par Papy Octet Voir le message
    J'essaie d'enregistrer cette adresse dans une variable, et ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossierPrincipal = (os.getcwd())
    Attention, tu n'enregistres pas l'adresse du dossier principal mais l'adresse de l'endroit où tu te trouves. C'est peut-être, dans ton cas, la même chose mais cela peut ne pas l'être tout le temps. Il ne faut pas confondre.
    De plus les parenthèses sont inutiles => dossierPrincipal = os.getcwd() (les parenthèses aussi ont un rôle dans Python donc on ne les met pas "au hasard") mais surtout... à quoi sert la variable en réalité puisque tu as déjà l'info dans os.getcwd() ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    bonjour

    oui, puisque tu utilises PyQt, donc une interface graphique, il est plus que probable que os.getcwd() ne soit pas la bonne valeur pour ton dossier "principal"

    Je n'arrive pas à indiquer l'adresse de destination de la copie sans quitter le dossierPrincipal avec la commande
    shutil.copy(f"{dossierPrincipal}/{fichier}.odt", f"{dossierPrincipal}/{sousdossier}/") cette fonction ne change justement pas le répertoire courant donc ta question n'a pas trop de sens
    Ou, alors tu essayes de passer des chemins relatifs ?


    --------
    Note: si c'est que pour linux, et si ce n'est pas un déplacement (ou alors pourquoi copier...), je penserais en premier à un lien symbolique.

    Citation Envoyé par N_BaH Voir le message
    pourquoi ne pas faire ça en shell
    En shell (python subprocess), il n'est pas possible de contrôler les erreurs alors qu'en python, j'ai des exceptions que je peux gérer et accessoirement, dans la boucle, je peux faire d'autres opérations sur ces fichiers (avant ou après copie).
    Si c'est en natif dans python (pas une bibliothèque à installer), c'est normalement une mauvaise idée d'utiliser le shell

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 686
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    s'il avait été dit explicitement qu'il s'agit d'un projet plus large, je n'aurais rien dit.
    là, j'en suis à « je veux copier des fichiers en python », c'est une tâche triviale, alors un simple interpréteur de commandes me semble être l'outil approprié : une boucle, quelques tests pour faire bien, et hop !

    pourquoi le shell n'est-il pas python !?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Note: si c'est que pour linux, et si ce n'est pas un déplacement (ou alors pourquoi copier...), je penserais en premier à un lien symbolique.
    Ou un lien réel (on semble se trouver dans le même FS et le lien réel a l'avantage de ne pas dépendre de son original).
    En fait j'y avais pensé aussi puis je me suis dit "peut-être il y a une histoire de sauvegarde" et donc dans ce cas le lien ne tient plus (mais dans ce cas je préconiserais alors le tar+xz)
    Le PO nous dira mieux ce qu'il veut faire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 213
    Billets dans le blog
    1
    Par défaut
    Merci pour toutes ces réponses.

    Écrire une telle chose en python est un exercice "intellectuel" pour moi.
    Il est bien plus simple de créer ce fameux dossier avec les fichiers de départ contenus puis de copier simplement le dossier là où j'en au besoin. Je dois alors modifier son nom ainsi que ceux des sous-dossiers à chaque fois. Alors, j'ai pensé python car j'avais déjà créé un tel "programme" qui fonctionnait très bien sous python 2.X. Avec la nouvelle mouture python, version 3.X, il y a de nombreuses instructions qui coincent.

    Dans le détail, je demande un nouveau nom de dossier (qui change à chaque édition). Exempls : FA208_Etoile, puis FA209_Maison, ...
    Avec ce nom, je nomme le dossier, puis en ajoutant un mot descriptif à chaque nom de sous-dossier, je crée les sous-dossiers. le sous-dossier Originaux ou "BAT", deviendra, en récupérant le numéro précédant le "_Etoile", le "_Maison" et en ajoutant ce numéro au nom du sous-dossier FA208-Maison, ou FA208_Etoile, et ainsi de suite.
    Je copie ensuite des fichiers originaux dans chaque sous-dossier en complétant leur nom avec le numéro du dossier principal. Le fichier "BibNatDep" devient FA208_BibNatDep, etc.
    Au final, j'obtiens :
    FA208_Etoile
    ....|_> FA208_BAT qui va contenir le fichier FA208_BibNatDoc, ...
    ....|_> FA208_Originaux qui va contenir FA208_GrapheCoul, ...

    Ceci pour pouvoir gérer chaque dossier d'édition de fascicule à ma manière.

    Pour ce qui est du shell ... cela reste encore plus problématique pour moi : je ne l'ai pour ainsi dire jamais pratiqué pour écrire de tels "programmes". alors que je suis sous Linux depuis plus de 30 ans

    A+

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Papy Octet Voir le message
    ...car j'avais déjà créé un tel "programme" qui fonctionnait très bien sous python 2.X. Avec la nouvelle mouture python, version 3.X, il y a de nombreuses instructions qui coincent.
    En réalité pas tant que ça et il existe des outils de conversion. Essaye de donner ta v2 qu'on voie ce qui se passe et où ça coince pour la v3...

    Citation Envoyé par Papy Octet Voir le message
    FA208_BAT qui va contenir le fichier FA208_BibNatDoc, ...
    Bizarre, pourquoi rajouter le nom du dossier au nom du fichier? Enfin c'est pas pour critiquer (chacun est libre) mais c'est ultra contraignant !!! Si le dossier change de nom, faut renommer tous les fichiers qui s'y trouvent (probablement la raison d'être du programme d'ailleurs). Mais rien n'interdit de mettre des noms plus "universels" style FA208_BAT qui va contenir le fichier BibNatDoc ce qui te libère de cette contrainte. C'est un petit peu fait pour ça l'arborescence, pouvoir avoir des fichiers de même noms à différents endroits. Effectivement l'inconvénient c'est que si le fichier quitte le dossier, tu n'as plus de trace de son "appartenance" d'origine. Mais... est-ce que c'est une possibilité "éventuelle"?

    Citation Envoyé par Papy Octet Voir le message
    alors que je suis sous Linux depuis plus de 30 ans
    Bigre... depuis avant 1993 soit moins de deux ans après sa création... Effectivement s'y être intéressé aussi tôt fait preuve d'un intérêt "passionnel" pour cet OS donc ne jamais s'être mis au shell est... déroutant. Comment tu faisais, avant, quand tu devais automatiser certaines actions??? Parce que pour moi c'est ça qui m'a amené à m'y mettre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 213
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En réalité pas tant que ça et il existe des outils de conversion. Essaye de donner ta v2 qu'on voie ce qui se passe et où ça coince pour la v3...

    Bigre... depuis avant 1993 soit moins de deux ans après sa création... Effectivement s'y être intéressé aussi tôt fait preuve d'un intérêt "passionnel" pour cet OS donc ne jamais s'être mis au shell est... déroutant. Comment tu faisais, avant, quand tu devais automatiser certaines actions??? Parce que pour moi c'est ça qui m'a amené à m'y mettre...
    J'ai suivi des cours d'informatique industrielle, il y a bien longtemps, où on pratiquait le C.
    Dès mes débuts donc, je trouvais que les logiciels coûtaient bien trop cher pour mes faibles revenus et donc, je me suis intéressé très rapidement à Linux. Ce n'est que quand j'ai été à la retraite, il y a 20 ans, que j'ai enfin pu quitter le monde Microsoft pour Linux et Debian en particulier. Et je ne m'en suis jamais plaint ;-) J'y toujours trouvé ce que je recherche tant du point de vue logiciels que du participatif. J'ai donc tout naturellement participé à la traduction anglais-français de pages web, de documentation de logiciels, et aussi officié comme correcteur en français. Un juste renvoi d'ascenseur vers ce que Linux m'a offert Maintenant, à 73 balais, je pratique encore linux et le dessin 2D et 3D pour des créations textiles.
    A+

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Papy Octet Voir le message
    j'ai enfin pu quitter le monde Microsoft pour Linux et Debian en particulier...
    Ok, le débat va dévier mais je ne peux pas m'en empêcher...
    Debian j'ai beaucoup aimé à une époque. Truc robuste, testé, et surtout il s'intégrait parfaitement dans un environnement contraignant en terme de sécurité (exemple réseau local sans accès au net) donc on récupère les dépots (gros mais pas démesuré, aux alentours de 70Go) et on les installe dans le réseau et on continue à tout avoir même dans ce milieu fermé.
    Là où j'ai commencé à avoir quelques soucis, c'est que Debian ça a énormément de retard. Les types ils testent absolument tout avant de l'intégrer. Alors ok c'est super, super robuste, super fiable, mais aussi super arriéré (généralement 2 ans). Et parfois j'avais besoin d'un truc plus récent mais pas encore dispo. Donc téléchargement du source, compilation, etc. Faisable, mais chiant (surtout si le truc avait besoin de libTruc elle-aussi dans une version plus récente que celle du dépot et que ça descendait en arbre).

    Puis mes contraintes se sont assouplies et finalement j'ai décidé de basculer sur Ubuntu (Xubuntu pour être précis car j'aime bien Xfce). Et là ça a bien changé. Maintenant j'ai besoin d'un truc, hop un coup de apt-get et ça va le chercher sur le dépot, dépot du net toujours mis à jour. Ok je reste prudent (mon accès au net est toujours fermé par défaut, je ne l'ouvre que quand j'ai besoin de récupérer mon logiciel puis je le referme immédiatement et si j'oublie ben au reboot il est de nouveau fermé).
    A mon avis, toi qui n'a probablement pas ce type de contrainte cité au début, tu devrais t'y intéresser. Xubuntu est ultra léger, a une interface de bureau qui ressemble énormément à Debian. Et ils sont moins "intégristes" (franchement, refuser Firefox parce que l'image du renard n'est pas libre...). Et surtout tu bénéficieras de logiciels récents...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    Dommage que tu ne nous donnes pas ton code

    Si j'ai compris, tu désires écrire une chose de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def nouvelle_edition(id, nom):
        fichiers = ("BibNatDep", "BibNatDoc", "GrapheCoul")
        dossier_modeles = "/xxxx"
        dossier_travail = "/yyyy"
        sous_dossiers = ("BAT", "Originaux")
        créer_répertoire(f"{dossier_travail}/{id}_{nom}/")
        for dossier in sous_dossiers:
            créer_répertoire(f"{dossier_travail}/{id}_{nom}/{id}_{dossier}")
        for fichier in fichiers:
            for dossier in sous_dossiers:
                shutil.copy(
                    f"{dossier_modeles}/{fichier}",
                    f"{dossier_travail}/{id}_{nom}/{id}_{dossier}/{id}_{fichier}"
                )
    ps: ici j'ai abusé des f-string qui est une nouveauté (même dans python 3)



    -------

    je suppose que tu parles plutôt de unix il y a 30 ans (moi, c'est mon cas, j'ai connu bien avant linux)
    Perso, je n'ai accroché à linux desktop qu'il y a 10 ans (il me faut du confortable et mes quelques petits regards ne me donnaient pas cette impression avant)

  13. #13
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 213
    Billets dans le blog
    1
    Par défaut
    @papajoker : MERCI pour ta suggestion.
    Je vois très bientôt ce que je peux en faire.

    A+

    Unix avant Linux : OK, bien entendu ;-)

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/06/2021, 18h23
  2. Réponses: 2
    Dernier message: 24/02/2021, 17h15
  3. Copie de fichiers dans le dossier de la BDD
    Par alaind17 dans le forum HyperFileSQL
    Réponses: 4
    Dernier message: 11/07/2012, 23h48
  4. copie de fichiers dans différents dossiers
    Par mig87 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 02/09/2011, 09h56

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