Comment copier un fichier en Python ?
Quelle est la différence entre copie et fichier de copie ?
shutil
possède de nombreuses méthodes que vous pouvez utiliser. L'une d'entre elles est :
import shutil
shutil.copyfile(src, dst)
# 2nd option
shutil.copy(src, dst) # dst can be a folder; use shutil.copy2() to preserve timestamp
src
dans un fichier nommé dst
. Les deux src
y dst
doit être le nom complet des fichiers, y compris le chemin d'accès.IOError
une exception sera levée.dst
existe déjà, il sera remplacé.copy
, src
y dst
sont des noms de chemin donnés sous la forme str
s.Autre shutil
La méthode à examiner est la suivante shutil.copy2()
. Il est similaire mais préserve davantage de métadonnées (par exemple, les horodatages).
Si vous utilisez os.path
les opérations, l'utilisation copy
plutôt que copyfile
. copyfile
n'accepte que les chaînes de caractères.
copy2(src,dst)
est souvent plus utile que copyfile(src,dst)
parce que :
dst
d'être un répertoire (au lieu du nom de fichier cible complet), auquel cas la fonction nom de base de src
est utilisé pour créer le nouveau fichier ;Voici un petit exemple :
import shutil
shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given
shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext
J'essaie de copier aléatoirement 100k fichiers à partir de 1 million de fichiers. copyfile
est considérablement plus rapide que copy2
Ai-je raison de supposer que shutil.copy2('/dir/file.ext', '/new/dir/')
(avec une barre oblique après le chemin cible) lèvera l'ambiguïté sur le fait de savoir s'il faut copier dans un nouveau fichier appelé "dir" ou placer le fichier dans un répertoire de ce nom ?
La copie d'un fichier est une opération relativement simple, comme le montrent les exemples ci-dessous, mais il est préférable d'utiliser la commande module stdlib shutil pour cela.
def copyfileobj_example(source, dest, buffer_size=1024*1024):
"""
Copy a file from source to dest. source and dest
must be file-like objects, i.e. any object with a read or
write method, like for example StringIO.
"""
while True:
copy_buffer = source.read(buffer_size)
if not copy_buffer:
break
dest.write(copy_buffer)
Si vous voulez copier par nom de fichier, vous pouvez faire quelque chose comme ceci :
def copyfile_example(source, dest):
# Beware, this example does not handle any edge cases!
with open(source, 'rb') as src, open(dest, 'wb') as dst:
copyfileobj_example(src, dst)
J'ai remarqué il y a quelque temps que le module s'appelait shutil (au singulier) et non pas shutils (au pluriel), et en effet il est dans Python 2.3. Néanmoins, je laisse cette fonction ici à titre d'exemple.
Copier le contenu d'un fichier contenu est une opération simple. Copier le fichier avec ses métadonnées est tout sauf simple, d'autant plus si l'on veut être multiplateforme.
Vrai. En regardant la documentation de shutil, la fonction copyfile ne copie pas non plus les métadonnées.
Utiliser le module shutil .
copyfile(src, dst)
Copier le contenu du fichier nommé src dans un fichier nommé dst . L'emplacement de destination doit être accessible en écriture ; dans le cas contraire, une exception IOError sera levée. Dans le cas où dst existe déjà, il sera remplacé. Les fichiers spéciaux tels que les périphériques de caractères ou de blocs et les tuyaux ne peuvent pas être copiés avec cette fonction. src y dst sont des noms de chemin donnés sous forme de chaînes de caractères.
Jetez un coup d'œil à filesys pour toutes les fonctions de gestion des fichiers et des répertoires disponibles dans les modules Python standard.
Shutil ne copie pas réellement les fichiers. Il y a un gros avertissement en tête de la documentation . "Cela signifie que le propriétaire et le groupe du fichier sont perdus, de même que les ACL. Sous Mac OS, la fourche de ressource et les autres métadonnées ne sont pas utilisées. Cela signifie que les ressources seront perdues et que les codes de type de fichier et de créateur ne seront pas corrects. Sous Windows, les propriétaires de fichiers, les ACL et les flux de données alternatifs ne sont pas copiés."
Exemple de copie de répertoire et de fichier, de Tim Golden Les trucs de Python :
import os
import shutil
import tempfile
filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2
shutil.copy (filename1, filename2)
if os.path.isfile (filename2): print "Success"
dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2
shutil.copytree (dirname1, dirname2)
if os.path.isdir (dirname2): print "Success"
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.