Pythonis failide ja kataloogide kopeerimine: shutil mooduli täielik juhend

1. Sissejuhatus

Python pakub võimsaid tööriistu failide haldamiseks. Nende seas on failide kopeerimine üks igapäevasemaid ülesandeid. Käesolevas artiklis tutvustame, kuidas kasutada Pythoni standardteeki shutil, et kopeerida faile ja katalooge tõhusalt. Toome näiteid koodist, käsitleme ülekirjutamise vältimise tehnikaid, vigade töötlemist ning ka edasijõudnud failide kopeerimise meetodeid.

2. Ettevalmistus failide kopeerimiseks Pythonis

shutil mooduli importimine

shutil on Pythoni standardteegi osa ning eraldi paigaldamist ei vaja. Importimiseks kasuta järgmist koodi:

import shutil

Sellega saad faile kopeerida, liigutada ja kustutada. Lisaks saab seda kombineerida os mooduliga, et kontrollida failide ja kataloogide olemasolu ning parandada vigade käsitlemist.

shutil mooduli eelised

shutil paistab silma oma lihtsa süntaksi ja intuitiivse kasutuse poolest. Eriti kasulik on see, kui on vaja hallata tervet kataloogi või mitut faili korraga.

3. shutil mooduli põhiline kasutamine

shutil.copy() kasutamine

shutil.copy() on baasfunktsioon failide kopeerimiseks. See kopeerib lähtefaili määratud asukohta.

import shutil

# Faili kopeerimine
shutil.copy('original.txt', 'copy.txt')

Kui sihtkataloogis on juba samanimeline fail, kirjutatakse see üle.

shutil.copy2() kasutamine

shutil.copy2() kopeerib lisaks faili sisule ka metaandmed (näiteks loomiskuupäeva ja õigused).

import shutil

# Sisu ja metaandmete kopeerimine
shutil.copy2('original.txt', 'copy_with_metadata.txt')

See on kasulik juhul, kui on vaja teha faili täielik koopia.

4. Kataloogi tervikuna kopeerimine

shutil.copytree() kasutamine

shutil.copytree() kopeerib kogu kataloogi koos alamkataloogide ja failidega.

import shutil

# Kataloogi kopeerimine
shutil.copytree('source_directory', 'destination_directory')

Kui sihtkataloog on juba olemas, tekib viga. Seetõttu on soovitatav enne kontrollida.

Failide või kataloogide välistamine kopeerimisel

Spetsiifiliste failide või kaustade välistamiseks kasuta ignore argumenti koos shutil.ignore_patterns() funktsiooniga.

import shutil

# Ignoreeri .log-faile kopeerimisel
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))

See kood välistab kõik .log failid kopeerimisprotsessist.

年収訴求

5. Ülekirjutamise vältimise tehnikad

os.path.exists() kasutamine

Kui kasutada shutil.copy() või shutil.copy2(), kirjutatakse olemasolevad failid vaikimisi üle. Selle vältimiseks tuleks kontrollida enne kopeerimist, kas fail juba eksisteerib.

import shutil
import os

# Faili olemasolu kontroll ülekirjutamise vältimiseks
if not os.path.exists('copy.txt'):
    shutil.copy('original.txt', 'copy.txt')
else:
    print('Fail on juba olemas. Kopeerimine jäetakse vahele.')

pathlib.Path.exists() kasutamine

pathlib moodul võimaldab teha faili olemasolu kontrolli veelgi intuitiivsemalt.

from pathlib import Path

# Kontroll Path-objekti abil
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('Fail on juba olemas. Kopeerimine jäetakse vahele.')

6. Failide liigutamine Pythonis

shutil.move() kasutamine

shutil.move() liigutab faile või katalooge uude asukohta.

import shutil

# Faili liigutamine
shutil.move('original.txt', 'new_folder/original.txt')

Kui sihtkausta ei eksisteeri, tekib FileNotFoundError. Sellisel juhul on soovitatav kaust enne luua.

import shutil
import os

# Kausta olemasolu kontroll ja loomine
if not os.path.exists('new_folder'):
    os.makedirs('new_folder')

# Faili liigutamine
shutil.move('original.txt', 'new_folder/original.txt')

 

7. Pythoni failikopeerimise näited

Faili kopeerimise näide

import shutil

# Faili kopeerimine
shutil.copy('data.txt', 'backup/data_backup.txt')

Kataloogi kopeerimise näide

import shutil

# Kataloogi kopeerimine
shutil.copytree('project_files', 'project_backup')

Ülekirjutamise vältimise näide

import shutil
import os

# Faili kopeerimine ilma ülekirjutamiseta
if not os.path.exists('backup/report.txt'):
    shutil.copy('report.txt', 'backup/report.txt')
else:
    print('Fail on juba olemas. Kopeerimine katkestatakse.')

8. Täpsem: ainult kindla failivormingu kopeerimine

Kui kasutada glob moodulit, saab valida ainult kindla laiendiga faile (nt .txt või .csv).

import shutil
import glob

# Kõigi .txt-failide kopeerimine
for file in glob.glob('data/*.txt'):
    shutil.copy(file, 'backup/')

See kood kopeerib kõik .txt failid kaustast data kausta backup.

9. Vigade käsitlemine ja erindite töötlemine

Failioperatsioonidega kaasnevad sageli vead, näiteks faili puudumine või õiguste probleemid. Seetõttu on oluline lisada erindite käsitlemine.

Lihtne erindite käsitlemise näide

import shutil

try:
    shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
    print(f'Faili ei leitud: {e}')
except PermissionError as e:
    print(f'Õiguste viga: {e}')
except Exception as e:
    print(f'Ootamatu viga: {e}')

Selles koodis püüame kinni erinevad vead ja anname vastava teate.

10. Kokkuvõte

Pythoni shutil mooduli abil saab faile ja katalooge hõlpsasti kopeerida. Kui lisada ülekirjutamise vältimise tehnikad, konkreetsete failide filtreerimine ja vigade töötlemine, muutub failihaldus turvalisemaks ja tõhusamaks. Kasuta neid meetodeid igapäevastes töövoogudes, et automatiseerida failihalduse protsesse Pythonis.