2017-01-02 2 views
1

J'ai un dossier contenant des photos et j'aimerais déplacer les photos de ce dossier vers un autre. Les fichiers:shutil ne déplace pas tous les fichiers

IMAG_01.JPG 
IMAG_02.JPG 
IMAG_03.JPG 
IMAG_04.JPG 
IMAG_05.JPG 
IMAG_06.JPG 
IMAG_07.JPG 
IMAG_08.JPG 
IMAG_09.JPG 

Mon code:

import os.path 
import shutil 
src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 
num_files = len([f for f in os.listdir(src)]) 
print(num_files) 
for x in range(num_files): 
    print(x) 
    picture = (os.listdir(src)[x]) 
    print(picture) 
    shutil.move(src+picture,dst+picture) 

Quand je lance le code, il faudra la moitié des dossiers, et me donne alors une erreur index out of range sur picture = (os.listdir(src)[x]). La sortie suivante:

12 
0 
IMAG_04.jpg 
1 
IMAG_07.jpg 
2 
IMAG_01.jpg 
3 
IMAG_02.jpg 
4 
IMAG_09.jpg 
5 
IMAG_08.jpg 
6 
Traceback (most recent call last): 
    File "upload.py", line 11, in <module> 
    picture = (os.listdir(src)[x]) 
IndexError: list index out of range 

Je comprends qu'il me dit que x est pas dans la liste, mais je ne comprends pas pourquoi cela est de lancer, car il devrait juste commencer à 0 et aller à 8.

Répondre

7

Vous créez des choses trop compliquées. Vous appelez os.listdir() à plusieurs reprises, tout en déplaçant les fichiers. Ainsi, votre liste de résultats devient de plus en plus courte à chaque fois.

Vous commencez avec 12 noms, mais une fois que vous déplaciez que vous obtenez maintenant seulement 11 noms dans le répertoire, puis 10, et au moment où votre x valeur frappe 6, il n'y a que 6 noms à gauche avec des index 0 jusqu'à 5, donc os.listdir()[x] échoue avec une exception IndexError.

Vous n'avez pas besoin de longueur et vous n'avez pas besoin d'utiliser range(). Appelez os.listdir()une fois et boucle sur les résultats:

import os.path 
import shutil 

src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 

for picture in os.listdir(src): 
    print(picture) 
    shutil.move(os.path.join(src, picture), os.path.join(dst, picture)) 

Maintenant vous avez une liste complète de tous les noms au début, et la boucle for attribue ces noms un par un à la variable picture. Que ces noms soient supprimés n'a plus d'importance, car nous n'appelons pas de nouveau os.listdir().

+0

Merci pour la réponse rapide et la réponse. Cela a fait l'affaire pour moi. Après avoir examiné mon code, je vois exactement ce que vous disiez de l'appeler deux fois. –