Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Pierre Maurette Newsgroups: fr.comp.lang.python Subject: Re: =?ISO-8859-15?Q?boucle_dans_fonction_r=E9cursive...?= Date: Tue, 16 Jun 2020 07:15:10 +0200 Organization: A noiseless patient Spider Lines: 95 Message-ID: References: <356860d9-d583-4b5c-9248-24ea6d8ca0fdo@googlegroups.com> Reply-To: maurette.pierre@free.fr Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15"; format=flowed Content-Transfer-Encoding: 8bit Injection-Info: reader02.eternal-september.org; posting-host="879c29d1602d877fac5ebe7c6e36d474"; logging-data="26266"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18a9kZPjCfqh50YsgnsysLKTSN+i8i7nmQ=" Cancel-Lock: sha1:/foUTF2casOFRzfi26L4daYKdRU= X-Newsreader: MesNews/1.08.06.00-fr X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~ Xref: csiph.com fr.comp.lang.python:3355 sideley@yahoo.com : > Bonjour, > > Je programme une petite routine de copie récursive de fichiers qui consiste à > déplacer tous les fichiers dans une arborescence vers un autre endroit. Il se > trouve que la boucle a un comportement inattendu: si le premier > sous répertoire (de premier niveau dans l'arborescence) obtenu par listdir() > est vide (ou devenu vide après le déplacement de son contenu) alors il > s'arrête, Il n'y a pas de passage à l'élément souvent du répertoire. Avez > vous une explications ? J'utilise WinPy 3.7.7. Ci dessous les lignes de > codes: > > import os, shutil, pathlib > def copie(dossier,rep_dest): > contenu_rep = os.listdir(dossier) > for elm in contenu_rep: > chemin = dossier + '/' + elm > if os.path.isdir(chemin): > dossier = chemin > copie(dossier ,rep_dest) > elif os.path.isfile(chemin) and (dossier != rep_dest): > shutil.move(chemin, rep_dest) > > def prog (): > dossier = input('Entrez le répertoire à scanner ') > rep_dest = input('Rép destinataire ? ') > copie(dossier,rep_dest) > print ('\n Fait') > return 1 Sans commentaire, je vous propose un bout de code: #! /usr/bin/env python3 # -*- coding: utf-8 -*- import os, shutil, sys ORIG = 'U:/TEST' DEST = 'U:/arduino/BACUPETEST' def reverse(): """ exit on problem or returns (bool) meaning "reverse move" """ cond_orig = os.path.isdir(ORIG) cond_dest = os.path.isdir(DEST) if cond_orig != cond_dest: return cond_dest else: print("y'a comme un blème ... ") sys.exit(0) def mymove(source, destination): """ :param source: source path, assumed exists :param destination: destination path, must not exists """ os.mkdir(destination) for (nom, cheminsource, chemindestination) in [(x, os.path.join(source,x), os.path.join(destination,x)) for x in os.listdir(source)]: if os.path.isdir(cheminsource): mymove(cheminsource, chemindestination) elif os.path.isfile(cheminsource): shutil.move(cheminsource, chemindestination) os.rmdir(source) def mysiouxmove(source, destination): """ :param source: source path, assumed exists :param destination: destination path, must not exists """ os.renames(source, destination) if __name__ == '__main__': if not reverse(): if os.path.isdir(DEST): shutil.rmtree(DEST) mymove(ORIG, DEST) # mysiouxmove(ORIG, DEST) else: if os.path.isdir(ORIG): shutil.rmtree(ORIG) mymove(DEST, ORIG) # mysiouxmove(DEST, ORIG) print('\n Fait') -- Pierre Maurette