Copier un exercice Python spécial

L'exercice "Copier spécial" est associé au matériel relatif au système de fichiers et aux commandes externes dans la section Utilitaires Python. Cet exercice se trouve dans le répertoire "copyspecial" de google-python-exercises. Téléchargez google-python-exercises.zip si ce n'est pas déjà fait ; consultez la section Configurer pour en savoir plus. Ajoutez votre code dans copyspecial.py.

Le programme copyspecial.py utilise un ou plusieurs répertoires comme arguments. Nous dirons qu'un fichier « spécial » est un fichier dont le nom contient le modèle __w__ quelque part, où w est un ou plusieurs caractères de mot. La fonction main() fournie inclut du code permettant d'analyser les arguments de la ligne de commande, mais pour le reste, ce sera à vous de décider. Écrivez des fonctions pour implémenter les fonctionnalités ci-dessous et modifiez main() pour appeler vos fonctions.

Fonctions suggérées pour votre solution(détails ci-dessous):

  • get_special_paths(dir) : renvoie la liste des chemins absolus des fichiers spéciaux dans le répertoire donné.
  • copy_to(paths, dir) à partir d'une liste de chemins d'accès, copie ces fichiers dans le répertoire donné
  • zip_to(paths, zippath) à partir d'une liste de chemins, compressez ces fichiers dans le fichier zip donné

Partie A (manipulation des chemins d'accès aux fichiers)

Dresser une liste des chemins absolus des fichiers spéciaux dans tous les répertoires. Dans le cas le plus simple, il vous suffit d'imprimer cette liste (ici, le "." après la commande est un argument unique indiquant le répertoire actuel). Affiche un chemin absolu par ligne.

$ ./copyspecial.py .
/Users/nparlante/pycourse/day2/xyz__hello__.txt
/Users/nparlante/pycourse/day2/zz__something__.jpg

Nous partirons du principe que les noms ne sont pas répétés d'un répertoire à l'autre (facultatif: vérifiez cette hypothèse et faites une erreur en cas de non-respect).

Partie B (copie de fichiers)

Si l'option "--todir dir" est présente au début de la ligne de commande, n'imprimez rien et copiez les fichiers dans le répertoire concerné, en le créant si nécessaire. Utilisez le module Python "shutil" pour copier des fichiers.

$ ./copyspecial.py --todir /tmp/fooby .
$ ls /tmp/fooby
xyz__hello__.txt        zz__something__.jpg

Partie C (appel d'un programme externe)

Si l'option "--tozip zipfile" est présente au début de la ligne de commande, exécutez la commande suivante: "zip -j zipfile <list all the files>". Un fichier ZIP contenant les fichiers sera alors créé. Pour vous amuser et vous rassurer, imprimez également la ligne de commande que vous allez exécuter en premier (comme illustré en cours). (Remarque sous Windows: Windows n'inclut aucun programme permettant de générer par défaut des archives .zip standards, mais vous pouvez télécharger le programme ZIP sans frais et ouvert à l'adresse www.info-zip.org). Pour les utilisateurs de Linux, si vous n'avez pas installé zip, vous pouvez l'installer en appelant sudo apt install zip .

$ ./copyspecial.py --tozip tmp.zip .

Command I'm going to do:zip -j tmp.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg

Si le processus enfant se termine avec un code d'erreur, quittez-le avec un code d'erreur et imprimez le résultat de la commande. Pour vérifier cela, essayez d'écrire un fichier ZIP dans un répertoire qui n'existe pas.

$ ./copyspecial.py --tozip /no/way.zip .

Command I'm going to do:zip -j /no/way.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg

zip I/O error: No such file or directory zip error: Could not create output file (/no/way.zip)