Introduzione

Python ha alcuni moduli integrati che ti consentono di eliminare file e directory.

Questo tutorial spiega come cancellare file e directory utilizzando le funzioni dei moduli os, pathlib e shutil.

Eliminare i file

In Python è possibile utilizzare os.remove(), os.unlink(), pathlib.Path.unlink() per cancellare un singolo file.

Il modulo os fornisce un modo portatile di interagire con il sistema operativo. Il modulo è disponibile per Python 2 e 3.

Per eliminare un singolo file con os.remove(), passa il percorso al file come argomento:

import os

file_path = '/tmp/file.txt'
os.remove(file_path)

Le funzioni os.remove() e os.unlink() sono semanticamente identiche:

import os

file_path = '/tmp/file.txt'
os.unlink(file_path)

Se il file specificato non esiste, viene generato un errore FileNotFoundError. Entrambe le funzioni os.remove() e os.unlink()possono eliminare solo i file, non le directory. Se il percorso indicato punta a una directory, genereranno un errore IsADirectoryError.

L'eliminazione di un file richiede un'autorizzazione di scrittura ed esecuzione sulla directory contenente il file. Altrimenti, riceverai un errore PermissionError.

Per evitare errori durante l'eliminazione dei file, è possibile utilizzare la gestione delle eccezioni per rilevare l'eccezione e inviare un messaggio di errore corretto:

import os

file_path = '/tmp/file.txt'

try:
    os.remove(file_path)
except OSError as e:
    print("Error: %s : %s" % (file_path, e.strerror))

Il modulo pathlib è disponibile in Python 3.4 e versioni successive. Se si desidera utilizzare questo modulo in Python 2, è possibile installarlo con pip. pathlib fornisce un'interfaccia orientata agli oggetti per lavorare con percorsi di filesystem per diversi sistemi operativi.

Per eliminare un file con il modulo pathlib, creare un oggetto Path che punta al file e chiamare il metodo unlink() sull'oggetto:

from pathlib import Path

file_path = Path('/tmp/file.txt')

try:
    file_path.unlink()
except OSError as e:
    print("Error: %s : %s" % (file_path, e.strerror))

pathlib.Path.unlink(), os.remove() e os.unlink() possono essere utilizzati anche per eliminare un collegamento simbolico.

Corrispondenza del modello

È possibile utilizzare il modulo glob per abbinare più file in base a un modello. Ad esempio, per rimuovere tutti i file .txt nella directory /tmp, dovresti usare qualcosa del genere:

import os
import glob

files = glob.glob('/tmp/*.txt')

for f in files:
    try:
        f.unlink()
    except OSError as e:
        print("Error: %s : %s" % (f, e.strerror))

Per eliminare in modo ricorsivo tutti i file .txt nella directory /tmp e tutte le sottodirectory sottostanti, passa l'argomento recursive=True alla funzione glob() e usa il modello ``**`:

import os
import glob

files = glob.glob('/tmp/**/*.txt', recursive=True)

for f in files:
    try:
        os.remove(f)
    except OSError as e:
        print("Error: %s : %s" % (f, e.strerror))

Il modulo pathlib include due funzioni glob glob() e rglob() per abbinare i file in una determinata directory. glob() corrisponde ai file solo nella directory di livello superiore. rglob() trova ricorsivamente tutti i file nella directory e tutte le sottodirectory. Il seguente codice di esempio elimina tutti i file .txt nella directory /tmp:

from pathlib import Path

for f in Path('/tmp').glob('*.txt'):
    try:
        f.unlink()
    except OSError as e:
        print("Error: %s : %s" % (f, e.strerror))

Eliminare le directory (cartelle)

In Python è possibile utilizzare os.rmdir() e pathlib.Path.rmdir() per eliminare una directory vuota e shutil.rmtree() per eliminare una directory non vuota.

L'esempio seguente mostra come rimuovere una directory vuota:

import os

dir_path = '/tmp/img'

try:
    os.rmdir(dir_path)
except OSError as e:
    print("Error: %s : %s" % (dir_path, e.strerror))

In alternativa, puoi eliminare le directory con il modulo pathlib:

from pathlib import Path

dir_path = Path('/tmp/img')

try:
    dir_path.rmdir()
except OSError as e:
    print("Error: %s : %s" % (dir_path, e.strerror))

Il modulo shutil consente di eseguire numerose operazioni di alto livello su file e directory.

Con la funzione shutil.rmtree() è possibile eliminare una determinata directory incluso il suo contenuto:

import shutil

dir_path = '/tmp/img'

try:
    shutil.rmtree(dir_path)
except OSError as e:
    print("Error: %s : %s" % (dir_path, e.strerror))

L'argomento passato a shutil.rmtree() non può essere un collegamento simbolico a una directory.

Conclusione

Python fornisce diversi moduli per la gestione dei file.

Abbiamo visto come utilizzare os.remove(), os.unlink() e pathlib.Path.unlink() per eliminare un singolo file, os.rmdir() e pathlib.Path.rmdir() per cancellare una directory vuota e shutil.rmtree() per cancellare ricorsivamente una directory e tutto il suo contenuto.

Prestare particolare attenzione durante la rimozione di file o directory, perché una volta che il file è stato eliminato, non può essere facilmente recuperato.