3530 votes

Comment copier des fichiers

Comment copier un fichier en Python ?

4372voto

Swati Points 8415

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
  • Copier le contenu du fichier nommé 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.
  • L'emplacement de destination doit être accessible en écriture. IOError une exception sera levée.
  • Si 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.
  • Avec 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.

192 votes

Quelle est la différence entre copie et fichier de copie ?

454 votes

Dans copy(src, dst), le dst peut être un répertoire.

51 votes

Notez que toutes les métadonnées ne seront pas copiées, en fonction de votre plateforme.

922voto

unmounted Points 10968

copy2(src,dst) est souvent plus utile que copyfile(src,dst) parce que :

  • il permet 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 ;
  • il préserve les informations de modification et d'accès originales (mtime et atime) dans les métadonnées du fichier (cependant, cela entraîne un léger surcoût).

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

40 votes

J'essaie de copier aléatoirement 100k fichiers à partir de 1 million de fichiers. copyfile est considérablement plus rapide que copy2

4 votes

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 ?

4 votes

@Vijay Je pense que cette surcharge est due à la copie des métadonnées.

108voto

pi. Points 6026

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)

25 votes

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.

5 votes

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.

3 votes

Vrai. En regardant la documentation de shutil, la fonction copyfile ne copie pas non plus les métadonnées.

82voto

Airsource Ltd Points 14291

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.

0 votes

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."

49voto

Noam Manos Points 145

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.com

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.

Powered by:

X