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
copyfileun director ca destinație și primeștiIsADirectoryError. Foloseștecopysau scrie calea completă a fișierului. - Copiezi un fișier peste el însuși și primești
shutil.SameFileError.
Comenzi înrudite
shutil.copytree() și shutil.ignore_patterns(): Copiază un director întreg, cu toate subdirectoarele, opțional ignorând anumite fișiere.shutil.move(): Mută un fișier sau un director, inclusiv pe alt disc.Path.rename(), replace(), move() și copy(): Redenumește, mută și copiază fișiere sau directoare.