Python propose plusieurs fonctions pour copier facilement des fichiers grâce au module shutil. Les fonctions copyfile(), copy(), copy2() et copyfileobj() réalisent toutes des opérations de copie, mais elles ne conservent pas les mêmes informations et ne s'utilisent pas exactement de la même manière. Ce tutoriel présente leurs différences à travers des exemples simples et pratiques.
- À propos de la copie de fichiers avec shutil
- Préparer les fichiers pour les exemples
- Copier un fichier avec copyfile()
- Fonctionnement de copyfile()
- Copier un fichier avec copy()
- Copier un fichier dans un dossier avec copy()
- Copier un fichier avec copy2()
- Différence entre copy() et copy2()
- Copier avec copyfileobj()
- Utiliser copyfileobj() avec des fichiers texte
- Utiliser copyfileobj() avec des fichiers binaires
- Différences entre les quatre fonctions
- Quelle fonction choisir ?
- Gérer les fichiers existants
- Gérer les erreurs de copie
- Exemple pratique de sauvegarde
- Copier plusieurs fichiers
- Points importants à retenir
- Conclusion
1. À propos de la copie de fichiers avec shutil
Le module shutil appartient à la bibliothèque standard de Python. Il n'est donc pas nécessaire de l'installer avec pip. Il fournit des fonctions de haut niveau pour manipuler les fichiers et les dossiers.
Pour la copie de fichiers, les quatre fonctions principales sont shutil.copyfile(), shutil.copy(), shutil.copy2() et shutil.copyfileobj().
Avant de pouvoir utiliser ces fonctions, nous devons importer le module shutil. Le programme suivant vérifie simplement que le module peut être utilisé.
1 2 | import shutil print("Module shutil chargé") |
Sortie :
1 | Module shutil chargé |
2. Préparer les fichiers pour les exemples
Pour tester les différents exemples de ce tutoriel, nous pouvons commencer par créer un fichier nommé source.txt. Le programme suivant crée ce fichier et y écrit une petite phrase.
1 2 3 | with open("source.txt", "w", encoding="utf-8") as fichier: fichier.write("Apprendre Python avec shutil.") print("Fichier source.txt créé") |
Sortie :
1 | Fichier source.txt créé |
Le fichier source.txt contient maintenant le texte Apprendre Python avec shutil. et pourra servir de fichier source dans les exemples suivants.
3. Copier un fichier avec copyfile()
La fonction shutil.copyfile() permet de copier le contenu d'un fichier source vers un fichier de destination. Sa syntaxe simplifiée est shutil.copyfile(source, destination).
Dans l'exemple suivant, le contenu de source.txt est copié dans un nouveau fichier nommé copie.txt.
1 2 3 | import shutil shutil.copyfile("source.txt", "copie.txt") print("Copie terminée") |
Sortie :
1 | Copie terminée |
Après l'exécution du programme, nous disposons de deux fichiers : source.txt et copie.txt. Leur contenu est identique.
4. Fonctionnement de copyfile()
Avec copyfile(), les arguments doivent représenter des fichiers. La destination correspond au chemin du nouveau fichier. Cette fonction copie essentiellement les données et n'a pas pour objectif de conserver les métadonnées du fichier source.
Nous pouvons vérifier le contenu du fichier obtenu en l'ouvrant après la copie.
1 2 3 4 | import shutil shutil.copyfile("source.txt", "destination.txt") with open("destination.txt", "r", encoding="utf-8") as fichier: print(fichier.read()) |
Sortie :
1 | Apprendre Python avec shutil. |
Le contenu de destination.txt est donc identique à celui de source.txt.
5. Copier un fichier avec copy()
La fonction shutil.copy() copie le contenu du fichier ainsi que son mode de permissions. Elle est également plus pratique que copyfile() lorsque la destination est un dossier.
Dans l'exemple suivant, nous créons une copie du fichier source sous le nom document.txt.
1 2 3 | import shutil shutil.copy("source.txt", "document.txt") print("Fichier copié avec copy()") |
Sortie :
1 | Fichier copié avec copy() |
Le fichier document.txt contient les mêmes données que source.txt et le mode de permissions du fichier source est également copié.
6. Copier un fichier dans un dossier avec copy()
L'un des avantages de shutil.copy() est que la destination peut être directement un dossier existant. Le nom original du fichier est alors conservé automatiquement.
Le programme suivant crée d'abord un dossier sauvegarde, puis y copie source.txt.
1 2 3 4 5 | import os import shutil os.makedirs("sauvegarde", exist_ok=True) shutil.copy("source.txt", "sauvegarde") print("Fichier copié dans sauvegarde") |
Sortie :
1 | Fichier copié dans sauvegarde |
Le fichier obtenu est alors disponible sous le chemin sauvegarde/source.txt.
7. Copier un fichier avec copy2()
La fonction shutil.copy2() est proche de copy(), mais elle essaie de conserver davantage de métadonnées du fichier source. Elle est notamment utile lorsque nous voulons réaliser une copie aussi fidèle que possible.
Le programme suivant copie source.txt dans copie_complete.txt avec copy2().
1 2 3 | import shutil shutil.copy2("source.txt", "copie_complete.txt") print("Copie avec métadonnées terminée") |
Sortie :
1 | Copie avec métadonnées terminée |
En plus du contenu et du mode de permissions, copy2() tente de préserver les métadonnées prises en charge par le système, notamment les informations temporelles du fichier.
8. Différence entre copy() et copy2()
La différence essentielle entre copy() et copy2() concerne les métadonnées. copy() copie le contenu et le mode de permissions, tandis que copy2() appelle également les mécanismes permettant de préserver davantage de métadonnées.
Nous pouvons par exemple comparer les dates de dernière modification après une copie réalisée avec copy2().
1 2 3 4 5 | import os import shutil shutil.copy2("source.txt", "copie2.txt") print(os.path.getmtime("source.txt")) print(os.path.getmtime("copie2.txt")) |
Sortie possible :
1 2 | 1790339200.125 1790339200.125 |
Les valeurs exactes dépendent de l'ordinateur et du système de fichiers. L'important ici est que copy2() cherche à conserver la date de modification du fichier source.
9. Copier avec copyfileobj()
La fonction shutil.copyfileobj() fonctionne différemment des fonctions précédentes. Elle travaille avec des objets fichiers déjà ouverts plutôt qu'avec de simples chemins de fichiers.
Nous devons donc ouvrir le fichier source en lecture et le fichier destination en écriture avant d'effectuer la copie.
1 2 3 4 5 | import shutil with open("source.txt", "rb") as source: with open("copie_obj.txt", "wb") as destination: shutil.copyfileobj(source, destination) print("Copie avec copyfileobj() terminée") |
Sortie :
1 | Copie avec copyfileobj() terminée |
Le fichier copie_obj.txt contient maintenant les mêmes données que source.txt.
10. Utiliser copyfileobj() avec des fichiers texte
copyfileobj() peut également travailler avec des fichiers ouverts en mode texte, à condition que les objets source et destination utilisent des modes compatibles.
Dans cet exemple, les deux fichiers sont ouverts respectivement avec les modes r et w.
1 2 3 4 5 | import shutil with open("source.txt", "r", encoding="utf-8") as source: with open("copie_texte.txt", "w", encoding="utf-8") as destination: shutil.copyfileobj(source, destination) print("Copie texte terminée") |
Sortie :
1 | Copie texte terminée |
Cette technique est utile lorsque nous manipulons déjà des objets fichiers dans notre programme.
11. Utiliser copyfileobj() avec des fichiers binaires
Pour copier des images, des fichiers PDF, des archives ou d'autres fichiers binaires, il est préférable d'utiliser les modes rb pour la lecture et wb pour l'écriture.
L'exemple suivant montre comment copier une image appelée photo.jpg.
1 2 3 4 5 | import shutil with open("photo.jpg", "rb") as source: with open("copie_photo.jpg", "wb") as destination: shutil.copyfileobj(source, destination) print("Image copiée") |
Sortie :
1 | Image copiée |
L'utilisation du mode binaire permet de copier les octets du fichier sans effectuer de traitement propre aux fichiers texte.
12. Différences entre les quatre fonctions
copyfile() copie principalement le contenu d'un fichier vers un autre fichier. Nous devons fournir le chemin du fichier source et celui du fichier destination.
copy() copie le contenu et le mode de permissions. La destination peut être un fichier ou un dossier existant.
copy2() fonctionne comme copy(), mais essaie en plus de conserver davantage de métadonnées, notamment les informations temporelles prises en charge.
copyfileobj() travaille avec des objets fichiers ouverts. Elle est particulièrement intéressante lorsque les fichiers sont déjà ouverts ou lorsque les données sont manipulées comme des flux.
13. Quelle fonction choisir ?
Utilisez copyfile() lorsque vous souhaitez simplement copier le contenu d'un fichier vers un autre fichier sans chercher à conserver ses métadonnées.
Utilisez copy() pour une copie classique lorsque vous souhaitez également conserver le mode de permissions et éventuellement indiquer un dossier comme destination.
Utilisez copy2() lorsque la conservation des métadonnées est importante, notamment pour les opérations de sauvegarde.
Utilisez copyfileobj() lorsque votre programme travaille déjà avec des objets fichiers ou des flux ouverts.
14. Gérer les fichiers existants
Lorsque le fichier de destination existe déjà, les fonctions de copie peuvent remplacer son contenu. Il est donc prudent de vérifier l'existence du fichier avant d'effectuer certaines copies.
Le programme suivant utilise os.path.exists() pour éviter d'écraser accidentellement un fichier existant.
1 2 3 4 5 6 7 8 | import os import shutil destination = "copie.txt" if os.path.exists(destination): print("Le fichier existe déjà") else: shutil.copy("source.txt", destination) print("Fichier copié") |
Sortie possible :
1 | Le fichier existe déjà |
Cette vérification est particulièrement utile lorsque le fichier de destination contient des données qu'il ne faut pas perdre.
15. Gérer les erreurs de copie
Une copie peut échouer si le fichier source n'existe pas, si la destination n'est pas accessible ou si l'utilisateur ne possède pas les permissions nécessaires. Les blocs try et except permettent de gérer proprement ces erreurs.
Dans cet exemple, nous interceptons notamment les erreurs liées à l'absence du fichier et aux permissions.
1 2 3 4 5 6 7 8 | import shutil try: shutil.copy("source.txt", "sauvegarde.txt") print("Copie réussie") except FileNotFoundError: print("Fichier source introuvable") except PermissionError: print("Permission refusée") |
Sortie possible :
1 | Copie réussie |
La gestion des exceptions évite que le programme s'arrête brutalement lorsqu'une opération de copie rencontre un problème.
16. Exemple pratique de sauvegarde
La fonction copy2() convient bien à la création d'une copie de sauvegarde d'un fichier, car elle essaie de conserver davantage d'informations sur le fichier original.
Le programme suivant crée une copie de sauvegarde de rapport.txt sous le nom rapport_backup.txt.
1 2 3 4 5 | import shutil source = "rapport.txt" destination = "rapport_backup.txt" shutil.copy2(source, destination) print("Sauvegarde créée :", destination) |
Sortie :
1 | Sauvegarde créée : rapport_backup.txt |
Nous disposons alors d'une copie du fichier pouvant être utilisée pour restaurer les données en cas de problème avec le fichier original.
17. Copier plusieurs fichiers
Les fonctions de shutil peuvent être utilisées dans une boucle pour copier plusieurs fichiers. Cette technique permet par exemple de sauvegarder une liste de documents dans un dossier.
Dans cet exemple, nous supposons que le dossier sauvegarde existe et nous y copions trois fichiers avec copy2().
1 2 3 4 5 | import shutil fichiers = ["cours.txt", "exercice.txt", "solution.txt"] for fichier in fichiers: shutil.copy2(fichier, "sauvegarde") print(fichier, "copié") |
Sortie :
1 2 3 | cours.txt copié exercice.txt copié solution.txt copié |
Cette méthode est pratique pour automatiser la sauvegarde de plusieurs fichiers sans répéter manuellement les instructions de copie.
18. Points importants à retenir
copyfile() est adaptée à une copie simple du contenu entre deux chemins de fichiers.
copy() conserve également le mode de permissions du fichier source.
copy2() tente de préserver davantage de métadonnées et constitue souvent un bon choix pour les sauvegardes.
copyfileobj() ne reçoit pas directement des chemins mais des objets fichiers ouverts.
Pour copier un dossier complet avec ses fichiers et ses sous-dossiers, ces fonctions ne sont pas suffisantes : il faut généralement utiliser shutil.copytree().
19. Conclusion
Le module shutil offre plusieurs solutions pour copier des fichiers en Python. Même si copyfile(), copy(), copy2() et copyfileobj() semblent proches, chacune répond à un besoin particulier.
Pour une copie simple du contenu, copyfile() est suffisante. Pour conserver les permissions, copy() est plus appropriée. Lorsque les métadonnées doivent être préservées autant que possible, copy2() est généralement préférable. Enfin, copyfileobj() est particulièrement adaptée à la manipulation de fichiers ou de flux déjà ouverts.
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


