Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

boucle dans fonction récursive...

3 réponses
Avatar
sideley
Bonjour,

Je programme une petite routine de copie r=C3=A9cursive de fichiers qui con=
siste =C3=A0 d=C3=A9placer tous les fichiers dans une arborescence vers un =
autre endroit. Il se trouve que la boucle <for...in> a un comportement inat=
tendu: si le premier sous r=C3=A9pertoire (de premier niveau dans l'arbores=
cence) obtenu par listdir() est vide (ou devenu vide apr=C3=A8s le d=C3=A9p=
lacement de son contenu) alors il s'arr=C3=AAte, Il n'y a pas de passage =
=C3=A0 l'=C3=A9l=C3=A9ment souvent du r=C3=A9pertoire. 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 =3D os.listdir(dossier)
for elm in contenu_rep:
chemin =3D dossier + '/' + elm
if os.path.isdir(chemin):
dossier =3D chemin
copie(dossier ,rep_dest)
elif os.path.isfile(chemin) and (dossier !=3D rep_dest):
shutil.move(chemin, rep_dest)

def prog ():
dossier =3D input('Entrez le r=C3=A9pertoire =C3=A0 scanner ')
rep_dest =3D input('R=C3=A9p destinataire ? ')
copie(dossier,rep_dest)
print ('\n Fait')
return 1

3 réponses

Avatar
Benoit Izac
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 <for...in> 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 # 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
Avatar
Artis Sideley
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 <for...in> 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 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.
Avatar
Pierre Maurette
:
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 <for...in> 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