Aller au contenu

Manipuler les fichiers et les dossiers

pathlib : chemins orientés objet

La classe Path facilite la construction de chemins et les opérations courantes sur les fichiers.

Élément Rôle
Path.cwd() / Path.home() Répertoire courant / personnel.
path / "name" Construire un chemin enfant.
exists(), is_file(), is_dir() Examiner un chemin.
mkdir(parents=True, exist_ok=True) Créer des dossiers.
read_text() / write_text() Lire / écrire du texte.
read_bytes() / write_bytes() Lire / écrire des octets.
iterdir() Parcourir les enfants directs.
glob() / rglob() Rechercher des chemins par motif.
rename() / unlink() Renommer / supprimer un fichier.
from pathlib import Path

folder = Path("standard_library_examples")
folder.mkdir(exist_ok=True)
path = folder / "message.txt"
path.write_text("Bonjour Python !", encoding="utf-8")
print(path.read_text(encoding="utf-8"))

for item in sorted(folder.glob("*.txt")):
    print(item.name)

write_text() remplace le contenu existant. Path propose aussi name, stem, suffix et parent pour examiner les composants d'un chemin.

Parallèle C# et .NET

string folder = "standard_library_examples";
Directory.CreateDirectory(folder);
string path = Path.Combine(folder, "message.txt");
File.WriteAllText(path, "Bonjour Python !", Encoding.UTF8);
Console.WriteLine(File.ReadAllText(path, Encoding.UTF8));
foreach (string item in Directory.EnumerateFiles(folder, "*.txt").OrderBy(p => p))
    Console.WriteLine(Path.GetFileName(item));

Les opérations de Path Python se répartissent entre System.IO.Path, File, Directory, FileInfo et DirectoryInfo. EnumerateFiles() produit les résultats progressivement ; GetFiles() matérialise un tableau. Pour une recherche récursive, utilisons SearchOption.AllDirectories, avec une gestion adaptée des erreurs d’accès. Les règles exactes des motifs ne sont pas toutes identiques à celles de glob().

shutil : opérations de haut niveau

Fonction Rôle
copy(source, destination) Copier un fichier et ses permissions.
copy2(source, destination) Copier en tentant aussi de préserver les métadonnées.
copytree(source, destination) Copier une arborescence.
move(source, destination) Déplacer un fichier ou un dossier.
rmtree(path) Supprimer une arborescence.
disk_usage(path) Obtenir l'espace total, utilisé et libre.
make_archive(...) Créer une archive.
import shutil
from pathlib import Path

folder = Path("standard_library_examples")
folder.mkdir(exist_ok=True)
source = folder / "source.txt"
source.write_text("Exemple", encoding="utf-8")
shutil.copy2(source, folder / "copy.txt")

Les fonctions de suppression agissent réellement sur les données. copy2() ne garantit pas la conservation de toutes les métadonnées sur tous les systèmes.

Parallèle C# et .NET

string folder = "standard_library_examples";
Directory.CreateDirectory(folder);
string source = Path.Combine(folder, "source.txt");
File.WriteAllText(source, "Exemple", Encoding.UTF8);
File.Copy(source, Path.Combine(folder, "copy.txt"), overwrite: true);

File.Copy(), File.Move() et Directory.Move() couvrent les opérations principales. Directory.Delete(path, recursive: true) supprime une arborescence ; DriveInfo renseigne l’espace disque. File.Copy() n’est pas un contrat de préservation de métadonnées identique à copy2(). La copie récursive d’un dossier nécessite une composition ou un outil dédié.

tempfile : ressources temporaires

TemporaryDirectory() crée un dossier temporaire nettoyé à la sortie du bloc with. TemporaryFile() et NamedTemporaryFile() créent des fichiers temporaires.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "work.txt"
    path.write_text("Traitement temporaire", encoding="utf-8")
    print(path.read_text(encoding="utf-8"))

L'ouverture simultanée d'un fichier temporaire nommé dépend des options et du système ; un dossier temporaire est souvent simple pour les traitements impliquant plusieurs outils.

Parallèle C# et .NET

DirectoryInfo folder = Directory.CreateTempSubdirectory("python-book-");
try
{
    string path = Path.Combine(folder.FullName, "work.txt");
    File.WriteAllText(path, "Traitement temporaire", Encoding.UTF8);
    Console.WriteLine(File.ReadAllText(path, Encoding.UTF8));
}
finally
{
    folder.Delete(recursive: true);
}

Directory.CreateTempSubdirectory() (.NET 7+) crée un dossier temporaire. Le nettoyage est explicite ici : l’objet DirectoryInfo ne le supprime pas à sa libération. Path.GetTempFileName() crée un fichier ; Path.GetRandomFileName() ne crée rien. L’adaptation d’un TemporaryDirectory s’appuie sur try/finally ou un gestionnaire IDisposable personnalisé.

zipfile : archives ZIP

La classe ZipFile permet de créer, lire et examiner une archive.

Méthode Rôle
write(path, arcname=...) Ajouter un fichier.
writestr(name, data) Ajouter directement du contenu.
namelist() Lister les noms.
read(name) Lire les octets d'un membre.
open(name) Ouvrir un membre comme flux.
from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED

folder = Path("standard_library_examples")
folder.mkdir(exist_ok=True)
archive_path = folder / "example.zip"

with ZipFile(archive_path, "w", compression=ZIP_DEFLATED) as archive:
    archive.writestr("message.txt", "Bonjour Python !")

with ZipFile(archive_path) as archive:
    print(archive.read("message.txt").decode("utf-8"))

Pour des archives externes, contrôlons les noms, les tailles et la destination avant extraction.

Parallèle C# et .NET

string folder = "standard_library_examples";
Directory.CreateDirectory(folder);
string path = Path.Combine(folder, "example.zip");
using (var file = File.Create(path))
using (var archive = new ZipArchive(file, ZipArchiveMode.Create))
{
    var entry = archive.CreateEntry("message.txt", CompressionLevel.Optimal);
    using var writer = new StreamWriter(entry.Open(), new UTF8Encoding(false));
    writer.Write("Bonjour Python !");
}
using (var archive = ZipFile.OpenRead(path))
using (var reader = new StreamReader(archive.GetEntry("message.txt")!.Open(), Encoding.UTF8))
    Console.WriteLine(reader.ReadToEnd());

System.IO.Compression fournit ZipArchive, ZipFile et leurs entrées. ZipFile.CreateFromDirectory() archive un dossier. Le using C# joue ici le rôle du with Python pour fermer les flux et finaliser l’archive.