shutil.copy(), copy2(), copyfile() și rudele lor în Python

Copiază fișiere: doar conținutul, conținutul cu permisiunile, sau și datele de modificare.

Sintaxă
shutil.copy(sursa, destinatie)
shutil.copy2(sursa, destinatie)
shutil.copyfile(sursa, fisier_destinatie)
shutil.copyfileobj(f_sursa, f_dest)
shutil.copymode(sursa, dest) / shutil.copystat(sursa, dest)

Ce face shutil.copy(), copy2(), copyfile() și rudele lor

copyfile(sursa, dest) copiază doar conținutul, iar dest trebuie să fie un fișier. copy(sursa, dest) copiază conținutul și permisiunile; dest poate fi și un director. copy2() copiază în plus metadatele (data modificării), fiind cea mai apropiată de o copie făcută în managerul de fișiere.

copyfileobj(f1, f2) copiază între două fișiere deja deschise, pe bucăți, potrivit pentru fișiere mari sau fluxuri. copymode() copiază doar permisiunile, iar copystat() permisiunile și datele, fără conținut. Toate returnează calea destinației (în afară de copyfileobj, copymode, copystat).

Parametri

Parametru Descriere
sursa, destinatie Căile (text sau Path).
follow_symlinks Dacă este False, legăturile simbolice sunt copiate ca legături.

Ce returnează

Calea fișierului copiat (pentru copy, copy2, copyfile).

Exemple

Exemplul 1: Trei feluri de copiere

import os, shutil
with open("raport.txt", "w") as f:
    f.write("vânzări")
os.chmod("raport.txt", 0o640)
os.utime("raport.txt", (1792411200, 1792411200))
os.mkdir("backup")
print(shutil.copyfile("raport.txt", "copie1.txt"))
print(shutil.copy("raport.txt", "backup"))
print(shutil.copy2("raport.txt", "copie2.txt"))
for f in ["copie1.txt", "backup/raport.txt", "copie2.txt"]:
    st = os.stat(f)
    print(f, oct(st.st_mode & 0o777) == "0o640", st.st_mtime == 1792411200)

Rezultat

copie1.txt
backup/raport.txt
copie2.txt
copie1.txt False False
backup/raport.txt True False
copie2.txt True True

Exemplul 2: copyfileobj, copymode și copystat

import os, shutil
with open("mare.bin", "wb") as f:
    f.write(b"x" * 100_000)
with open("mare.bin", "rb") as sursa, open("mare_copie.bin", "wb") as dest:
    shutil.copyfileobj(sursa, dest, length=16 * 1024)
print(os.path.getsize("mare_copie.bin"))
os.chmod("mare.bin", 0o640)
shutil.copymode("mare.bin", "mare_copie.bin")
print(oct(os.stat("mare_copie.bin").st_mode & 0o777))
os.utime("mare.bin", (0, 0))
shutil.copystat("mare.bin", "mare_copie.bin")
print(os.path.getmtime("mare_copie.bin"))

Rezultat

100000
0o640
0.0

Greșeli frecvente

  • Dai lui copyfile un director ca destinație și primești IsADirectoryError. Folosește copy sau scrie calea completă a fișierului.
  • Copiezi un fișier peste el însuși și primești shutil.SameFileError.

Comenzi înrudite