boucle dans fonction récursive...

Le
sideley Avatar par défaut
Bonjour,

Je programme une petite routine de copie récursive de fichiers qui con=
siste à déplacer tous les fichiers dans une arborescence vers un =
autre endroit. Il se trouve que la boucle <forin> a un comportement inat=
tendu: si le premier sous répertoire (de premier niveau dans l'arbores=
cence) obtenu par listdir() est vide (ou devenu vide après le dép=
lacement 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 explic=
ations ?
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 (' Fait')
return 1
Vos réponses
Trier par : date / pertinence
Benoit Izac Avatar par défaut
Le #26549170
Bonjour,
Le 15/06/2020 à 22:04, a écrit dans le message
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 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 # dossier a été modifié

^^^^^^^
if os.path.isdir(chemin):
dossier = chemin # <= l'erreur

^^^^^^^
Tu utilises le même nom de variable qu'au dessus donc, à la boucle
suivante, dossier n'est plus celui passé en paramètre de copie().
copie(dossier ,rep_dest)

copie(chemin, 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

--
Benoit Izac
Artis Sideley Avatar par défaut
Le #26549172
On Monday, 15 June 2020 23:56:07 UTC+2, Benoit Izac wrote:
Bonjour,
Je programme une petite routine de copie récursive de fichiers qui
consiste à déplacer tous les fichiers dans une arborescence v ers un
autre endroit. Il se trouve que la boucle 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 d e passage
à l'élément souvent du répertoire. Avez vous une ex plications ?
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 # dossier a été mod ifié

^^^^^^^
if os.path.isdir(chemin):
dossier = chemin # <= l'erreur

^^^^^^^
Tu utilises le même nom de variable qu'au dessus donc, à la bou cle
suivante, dossier n'est plus celui passé en paramètre de copie( ).
copie(dossier ,rep_dest)

copie(chemin, 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

--
Benoit Izac

Merci bien. C'est éclairant.
Pierre Maurette Avatar par défaut
Le #26549178
:
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 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
Publicité
Poster une réponse
Anonyme Avatar par défaut