Comment copier un fichier en Python

Introduction

Lorsqu’il s’agit d’utiliser Python pour copier des fichiers, il existe deux façons principales: utiliser le module shutil ou le module os. Toutes les méthodes os que nous montrons ici sont des méthodes qui nous permettent d’exécuter des commandes shell à partir de notre code Python, que nous utiliserons pour exécuter la commande copy (Windows) ou la commande cp (Unix).

Vous remarquerez que beaucoup de ces méthodes, dans le module shutil et le module os, ont des fonctionnalités très similaires (ce qui ne devrait pas être surprenant), mais chacune varie très légèrement les unes des autres, ce que je vais également expliquer.

Copier des fichiers avec le module shutil

Le module shutil propose plusieurs méthodes de haut niveau pour copier des fichiers. Voici les principaux:

copyfile

Cette méthode copie le contenu d’un fichier dans un autre fichier. La destination qui lui est fournie doit être un fichier inscriptible et avoir un nom différent du fichier source. Si les noms sont les mêmes, cela générera une erreur. Si le fichier de destination existe déjà, il sera remplacé par le fichier nouvellement copié.

La syntaxe de cette méthode est la suivante:

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

Par exemple, le code suivant copiera un fichier nommé « file1.txt « dans un fichier nommé « file2.txt »:

import shutilshutil.copyfile('file1.txt', 'file2.txt')

Une caractéristique intéressante et potentiellement utile de shutil.copyfile est l’argument booléen follow_symlinks. S’il est défini sur False et que le fichier source est un lien symbolique, alors au lieu de copier le fichier, un nouveau lien symbolique sera créé.

copy

Cette méthode est très similaire à copyfile, la principale différence étant qu’en plus de copier le contenu du fichier source, elle va plus loin et copie également les autorisations du système de fichiers du fichier. La copie des autorisations de fichiers n’est pas une tâche triviale dans la plupart des langages de programmation, c’est donc une fonctionnalité intéressante à avoir.

La syntaxe est la suivante:

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

Chacun de ces paramètres est le même que dans la méthode copyfile. Par exemple, le code suivant copiera « fichier1.txt « dans » fichier3.txt ».

import shutilshutil.copy('file1.txt', 'file3.txt')

Remarque: Assurez-vous de ne pas nommer votre script de la même manière que l’un des modules que vous importez (ce que j’ai fait par erreur lors du test du code pour cet article). Si vous le faites, vous obtiendrez une erreur lors de la tentative d’importation de ce module en raison d’un problème d’importation circulaire.

copy2

Comme pour les méthodes précédentes, la méthode copy2 est identique à la méthode copy, mais en plus de copier le contenu du fichier, elle tente également de conserver toutes les métadonnées du fichier source. Si la plate-forme ne permet pas l’enregistrement complet des métadonnées, alors copy2 ne renvoie pas l’échec et conservera simplement toutes les métadonnées qu’elle peut.

La syntaxe est la suivante:

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

Encore une fois, ces paramètres sont les mêmes que dans les commandes précédentes que nous avons mentionnées jusqu’à présent.

Par exemple, le code suivant copiera « file1.txt « dans » le fichier4.txt », ainsi que préserver les métadonnées du fichier d’origine, « fichier1.txt ».

import shutilshutil.copy2('file1.txt', 'file4.txt')
$ python copy-files.py $ ls -ltotal 32-rw-r--r-- 1 scott staff 91 Oct 27 11:26 copy-files.py-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file1.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:29 file3.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file4.txt

Comme nous pouvons le voir en exécutant notre code ci-dessus, « file1.txt » a été copié dans le « fichier4.txt ». Cependant, vous avez peut-être remarqué que la date de création était conservée sur le nouveau fichier, contrairement à shutil.copy, qui a copié « file1.txt « à » fichier3.txt » et lui a donné une nouvelle date de création.

copyfileobj

Cette méthode copie le contenu d’un fichier source dans un fichier de destination, à partir de la position actuelle du fichier source. Cela signifie que si vous lisez des données à partir de votre objet fichier source, la position à laquelle vous arrêtez de lire est la position copyfileobj commence à copier.

La syntaxe est la suivante:

shutil.copyfileobj(src_file_object, dest_file_object)

Les significations des paramètres du fichier source et du fichier de destination sont similaires aux commandes précédentes, mais maintenant, elles font référence à des objets. Le paramètre length est facultatif et représente la taille de la mémoire tampon qui est le nombre de piqûres conservées en mémoire pendant le processus de copie. Cette option peut être utile lors de la copie de fichiers très volumineux, car elle peut accélérer le processus de copie et éviter une utilisation incontrôlée de la mémoire.

Par exemple, le code suivant copiera « file1.txt « dans » le fichier5.txt »

import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)

Comme nous pouvons le voir, pour utiliser copyfileobj, nous devons ouvrir les fichiers en mode binaire (qui est la partie « b » de « rb » et « wb »). De plus, le fichier source doit être ouvert comme lisible et le fichier de destination doit être ouvert comme accessible en écriture (les parties « r » et « w », respectivement).

Copie de fichiers avec le module os

Le module os permet d’utiliser la fonctionnalité du système d’exploitation pour copier vos fichiers. Dans la plupart (sinon tous) des exemples à partir de maintenant, nous fournissons des exemples qui fonctionnent à la fois pour Windows et Unix. Les exemples sont différents en raison des commandes shell utilisées, alors assurez-vous de faire attention à la façon dont chaque appel de fonction est étiqueté dans les commentaires Python.

popen

Cette méthode ouvre un canal vers ou depuis votre commande. Cependant, notez que cette méthode a été obsolète dans Python 2.6, nous ne recommandons donc pas de l’utiliser sauf si vous le devez. Comme alternative, la documentation Python nous conseille d’utiliser des méthodes du module sous-processus à la place.

La syntaxe est la suivante:

os.popen(cmd])

Ici, la valeur renvoyée est un objet fichier connecté au tuyau. Cet objet peut être lu ou écrit en fonction du mode. Le mode par défaut est ‘r’, ce qui permet la lecture du contenu du fichier.

L’exemple ci-dessous copiera « file1.txt « dans » le fichier6.txt »:

import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')

L’exécution de la commande de cette manière est exactement la même que si vous l’exécutiez directement depuis la ligne de commande de votre terminal.

system

Cette méthode exécute la commande spécifiée dans un sous-shell. Il est disponible pour Unix et Windows. La syntaxe est la suivante :

os.system(command)

Ici command est une chaîne contenant la commande shell DOS ou Unix. Dans notre cas, c’est là que nous mettrons la commande copy ou cp.

Par exemple, le code suivant copiera « file1.txt « dans » fichier7.txt »

import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')

Cela semble identique à la commande précédente os.popen que nous venons d’utiliser, mais la commande est exécutée dans un sous-shell, ce qui signifie qu’elle est exécutée dans un thread séparé en parallèle à votre code d’exécution. Pour attendre son achèvement, vous devez appeler .wait() sur l’objet renvoyé par os.system.

Copie de fichiers avec le module de sous-processus

Le module de sous-processus a l’intention de remplacer certaines méthodes du module os (en particulier les méthodes os.system et les méthodes os.spawn*), et il présente deux méthodes principales pour accéder aux commandes du système d’exploitation. Ces méthodes sont call et check_output. Encore une fois, pour les systèmes Unix, la commande « copy file1.fichier txt2.txt » doit être remplacé par  » cp file1.fichier txt2.txt ».

Méthode d’appel

La documentation Python nous recommande d’utiliser la méthode call pour lancer une commande à partir du système d’exploitation.

La syntaxe est la suivante :

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

Le paramètre args inclura notre commande shell. Cependant, un mot d’avertissement, car la documentation Python nous avertit que l’utilisation de shell=True peut constituer un risque de sécurité.

En utilisant cet appel de fonction, nous pouvons exécuter notre commande de copie comme suit:

import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)

Comme le montre l’exemple ci-dessus, il suffit de passer une chaîne avec la commande shell, comme précédemment.

Et comme prévu, le système d’exploitation copiera « file1.txt « dans un fichier nommé « file8.txt ».

Méthode check_output

Cette méthode nous permet également d’exécuter une commande dans un shell. Cela ressemble beaucoup à la commande subprocess.run, sauf que par défaut, elle achemine les données de la sortie standard sous forme d’octets codés. La syntaxe est la suivante:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

Ici, le paramètre args inclut la commande shell que nous voulons utiliser. Encore une fois, la documentation Python nous avertit de l’utilisation de shell=True, utilisez donc cette méthode avec prudence.

Dans le code suivant, nous allons copier « fichier1.fichier txt « vers » 9.txt « en utilisant la commande check_output:

import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)

Et comme pour toutes les commandes que nous avons montrées dans cet article, cela copiera le fichier « file1.txt  » à la destination que nous avons spécifiée, qui est « file9.txt » ici.

Wrapping Up

Python nous offre de nombreuses façons de copier des fichiers, dont certaines font partie de l’ensemble des méthodes Python. D’autres utilisent certaines des puissantes méthodes de Python pour exécuter des commandes dans un shell, qui utilisent des commandes shell comme copy ou cp.

Vous ne savez pas lequel vous convient le mieux ? Nous avons présenté ici de nombreuses façons de copier des fichiers, ce qui est compréhensible. La méthode que vous utilisez pour copier un fichier dépend entièrement de vous et dépendra de vos besoins spécifiques. Bien que dans la plupart des cas, l’une des commandes shutil fonctionnera très bien pour vous. Essayez de commencer par shutil.copy2 et voyez si cela fait ce dont vous avez besoin.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *