2016-02-17 1 views
0

Donc, mon ami et moi avons eu un problème avec le premier projet de pratique du chapitre précédent d'Automate the Boring Stuff avec Python. L'invite va: "Ecrivez un programme qui parcourt une arborescence de dossiers et recherche les fichiers avec une certaine extension de fichier (comme .pdf ou .jpg) .Copier ces fichiers de n'importe quel endroit dans un nouveau dossier."Premier projet de pratique dans Automatiser les trucs ennuyeux avec Python, Ch. 9

Pour simplifier, nous essayons d'écrire un programme qui copie tous les fichiers .jpg de My Pictures vers un autre répertoire. Voici notre code:

#! python3 
# moveFileType looks in My Puctures and copies .jpg files to my Python folder 

import os, shutil 

def moveFileType(folder): 
    for folderName, subfolders, filenames in os.walk(folder): 
     for subfolder in subfolders: 
      for filename in filenames: 
       if filename.endswith('.jpg'): 
        shutil.copy(folder + filename, '<destination>') 

moveFileType('<source>') 

Nous continuons à obtenir une erreur le long des lignes de « FileNotFoundError: [Errno 2] Aucun fichier ou répertoire ». Editer: J'ai ajouté un "\" à la fin de mon chemin source (je ne suis pas sûr si c'est ce que vous vouliez dire, @Jacob H), et j'ai pu copier tous les fichiers .jpg dans ce répertoire, mais a reçu une erreur lorsqu'il a essayé de copier un fichier dans un sous-dossier de ce répertoire. J'ai ajouté une boucle for pour sous-dossier dans les sous-dossiers et je n'ai plus d'erreurs, mais il ne regarde pas réellement dans les sous-dossiers pour les fichiers .jpg.

+0

'' n'est pas un chemin, c'est probablement le problème que vous rencontrez. Vous devez remplacer et par les chemins de destination et source réels. En plus de cela, vérifiez ce qui est contenu dans la variable 'folder', il se peut qu'il ne se termine pas par le '/' dont vous avez besoin pour un chemin de fichier correct. –

+0

En outre, vous pouvez utiliser ['os.path.join'] (https://docs.python.org/2/library/os.path.html?os.path.join#os.path.join) pour rejoindre un ou plusieurs composants de chemin intelligemment. –

+0

et sont des chemins réels dans mon code, désolé pour la confusion! @JacobH – Jake

Répondre

0

Veillez à taper correctement l'adresse de destination du fichier source. Alors que j'ai testé votre code, j'ai écrit

moveFileType('/home/anum/Pictures') 

et j'ai eu une erreur;

IOError: [Errno 2] No such file or directory: 

et quand je l'ai écrit

moveFileType('/home/anum/Pictures/') 

le code a fonctionné parfaitement ... Essayez de faire ça, l'espoir qui fera votre travail. M en utilisant Python 2.7

Herez le code re défini pour entrer dans les sous-dossiers et copier les fichiers jpg à partir de là.

import os, shutil 

def moveFileType(folder): 
    for root, dirs, files in os.walk(folder): 
       for file in files: 
        if file.endswith('.jpg'): 
        image_path=os.path.join(root,file) # get the path location of each jpeg image. 
        print 'location: ',image_path 
        shutil.copy(image_path, '/home/anum/Documents/Stackoverflow questions') 


moveFileType('/home/anum/Pictures/') 
+0

J'ai ajouté la barre oblique et cela a fonctionné! Maintenant, j'ai du mal à l'obtenir pour rechercher les sous-dossiers. J'ai mis à jour mon message avec le nouveau code. – Jake

+0

Vérifiez ma réponse éditée ... –

1

Il existe un problème plus fondamental avec votre code. Lorsque vous utiliserez os.walk(), il parcourra déjà tous les répertoires à votre place, donc une boucle manuelle dans les sous-dossiers produira les mêmes résultats plusieurs fois.

L'autre problème, plus immédiat, est que os.walk() génère des noms de fichiers relatifs, vous devez donc les coller ensemble. Fondamentalement, vous omettez le nom du répertoire et cherchez dans le répertoire courant les fichiers que os.walk() trouve dans un sous-répertoire quelque part.

Voici une tentative rapide à fixer votre code:

def moveFileType(folder): 
    for folderName, subfolders, filenames in os.walk(folder): 
     for filename in filenames: 
      if filename.endswith('.jpg'): 
       shutil.copy(os.path.join(folderName, filename), '<destination>') 

Faire la fonction accepte un paramètre destination comme second argument, au lieu de hardcoding <destination>, rendrait beaucoup plus utile pour l'avenir.

+0

J'ai ajouté le code que vous avez recommandé et il était capable de trouver un plus .jpg dans un sous-répertoire, mais pas plusieurs autres .jpgs dans le même sous-répertoire et un autre sous-répertoire. – Jake

+0

Fonctionne pour moi. Le code est sensible à la casse, cependant; peut-être vous voulez 'filename.lower(). endswith ('. jpg')' normaliser le cas avant de comparer? – tripleee