Question

Comment copier un fichier en Python?

Je n'ai rien trouvé sous os .

Était-ce utile?

La solution

shutil propose de nombreuses méthodes utilisables. . L'un d'entre eux est:

from shutil import copyfile

copyfile(src, dst)

Copiez le contenu du fichier nommé src dans un fichier nommé dst . L'emplacement de destination doit être accessible en écriture. sinon, une exception IOError sera déclenché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 canaux ne peuvent pas être copiés avec cette fonction. src et dst sont des noms de chemins donnés en tant que chaînes.

Autres conseils

┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐
│     Function     │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│
├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤
│shutil.copy       │      No       │        Yes       │    No        │    Yes    │
│shutil.copyfile   │      No       │        No        │    No        │    No     │
│shutil.copy2      │      Yes      │        Yes       │    No        │    Yes    │
│shutil.copyfileobj│      No       │        No        │    Yes       │    No     │
└──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘

copie2 (src, dst) est souvent plus utile que copyfile (src, dst) car:

  • cela permet à dst d'être un répertoire (au lieu du nom de fichier cible complet), auquel cas le nom de base de src est utilisé pour créer le nouveau fichier;
  • il conserve la modification d'origine et les informations d'accès (mtime et atime) dans les métadonnées du fichier (toutefois, cela entraîne une légère surcharge).

Voici un court 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

Vous pouvez utiliser l'une des fonctions de copie de shutil package:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function              preserves     supports          accepts     copies other
                      permissions   directory dest.   file obj    metadata  
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
shutil.copy              ✔             ✔                 ☐           ☐
shutil.copy2             ✔             ✔                 ☐           ✔
shutil.copyfile          ☐             ☐                 ☐           ☐
shutil.copyfileobj       ☐             ☐                 ✔           ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Exemple:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')

La copie d'un fichier est une opération relativement simple, comme le montrent les exemples ci-dessous, mais vous devez plutôt utiliser Le module shutil stdlib 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)

En Python, vous pouvez copier les fichiers avec

.
import os
import shutil
import subprocess

1) Copie de fichiers à l'aide du module shutil

shutil.copyfile signature

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

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy signature

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

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2 signature

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

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj signature

shutil.copyfileobj(src_file_object, dest_file_object[, length])

# example
file_src = 'source.txt'  
f_src = open(file_src, 'rb')

file_dest = 'destination.txt'  
f_dest = open(file_dest, 'wb')

shutil.copyfileobj(f_src, f_dest)  

2) Copie de fichiers à l'aide du module os

os.popen signature

os.popen(cmd[, mode[, bufsize]])

# example
# In Unix/Linux
os.popen('cp source.txt destination.txt') 

# In Windows
os.popen('copy source.txt destination.txt')

os.system signature

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) Copie de fichiers à l'aide du module du sous-processus

subprocess.call signature

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

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True) 

# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)

subprocess.check_output / a> signature

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

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)

# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)

Utilisez le module de fermeture .

copyfile(src, dst)

Copiez le contenu du fichier nommé src dans un fichier nommé dst. L'emplacement de destination doit être accessible en écriture. sinon, une exception IOError sera déclenché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 canaux ne peuvent pas être copiés avec cette fonction. src et dst sont des noms de chemins donnés sous forme de chaînes.

Consultez filesys pour toutes les fonctions de gestion des fichiers et des répertoires disponibles. dans les modules Python standard.

Exemple de copie de répertoire et de fichier - Extrait du document Python de Tim Golden:

http://timgolden.me.uk/python/win32_how_do_do_i/ copy-a-file.html

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"

Vous pouvez utiliser os.system ('cp nameoffilegeneratedbyprogram / otherdirectory /')

ou comme je l'ai fait,

os.system('cp '+ rawfile + ' rawdata.dat')

rawfile est le nom que j'ai généré dans le programme.

Ceci est une solution uniquement Linux

Pour les petits fichiers et en utilisant uniquement les fonctions intégrées python, vous pouvez utiliser la ligne suivante:

with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())

Comme @maxschlepzig est mentionné dans les commentaires ci-dessous, ceci n’est pas optimal pour les applications dans lesquelles le fichier est trop volumineux ou lorsque la mémoire est critique. La réponse de Swati devrait être préférée.

Tout d’abord, j’ai dressé une liste exhaustive de méthodes d’alignement pour votre référence.

shutil_methods =
{'copy':['shutil.copyfileobj',
          'shutil.copyfile',
          'shutil.copymode',
          'shutil.copystat',
          'shutil.copy',
          'shutil.copy2',
          'shutil.copytree',],
 'move':['shutil.rmtree',
         'shutil.move',],
 'exception': ['exception shutil.SameFileError',
                 'exception shutil.Error'],
 'others':['shutil.disk_usage',
             'shutil.chown',
             'shutil.which',
             'shutil.ignore_patterns',]
}

Deuxièmement, expliquez les méthodes de copie par exemple:

  
      
  1. shutil.copyfileobj (fsrc, fdst [, longueur]) manipule des objets ouverts
  2.   
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
    ...:      shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
  
      
  1. shutil.copyfile (src, dst, *, follow_symlinks = True) Copier et renommer
  2.   
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
  
      
  1. shutil.copy () Copier sans conserver les métadonnées
  2.   
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
  
      
  1. shutil.copy2 () Copier en conservant les métadonnées
  2.   
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
  
      
  1. `shutil.copytree ()` `
  2.   

Copier de manière récursive une arborescence de répertoires complète ayant pour racine src, en renvoyant le répertoire de destination

Pour les gros fichiers, je lisais le fichier ligne par ligne et lisais chaque ligne dans un tableau. Ensuite, une fois que le tableau a atteint une certaine taille, ajoutez-le à un nouveau fichier.

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]
from subprocess import call
call("cp -p <file> <file>", shell=True)

À partir de Python 3.5 , vous pouvez le faire. les éléments suivants pour les petits fichiers (c'est-à-dire: fichiers texte, petits jpeg):

from pathlib import Path

source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())

write_bytes écrasera tout ce qui se trouvait à l'emplacement de la destination

open(destination, 'wb').write(open(source, 'rb').read())

Ouvrez le fichier source en mode lecture et écrivez dans le fichier de destination en mode écriture.

Python fournit des fonctions intégrées permettant de copier facilement des fichiers à l'aide des utilitaires du système d'exploitation.

La commande suivante est utilisée pour copier le fichier

shutil.copy(src,dst)

La commande suivante est utilisée pour copier un fichier avec des informations MetaData

shutil.copystat(src,dst)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top