Veel Python-programma's moeten door het bestandssysteem navigeren om bestanden te lezen en te schrijven. Een veelvoorkomende handeling is het ophalen van de huidige werkmap, vaak afgekort tot CWD.
Python heeft twee hoofdmodules die je kunt gebruiken om toegang te krijgen tot bestandspadnamen: deos-module en depathlib-module.
De os-module biedt de traditionele aanpak om de huidige werkmap op te vragen en werkt met paden en het bestandssysteem.
De pathlib is een nieuwere module die een objectgeoriënteerde, robuuste en platformonafhankelijke aanpak biedt.
In deze tutorial verken ik verschillende technieken om de huidige werkmap op te halen en te bewerken. Wil je meer leren over Python, bekijk dan gerust mijn andere blogposts:
De huidige werkmap is de map waarin een Python-programma wordt uitgevoerd. Dit dient als referentiepunt voor relatieve bestandspaden en geeft het programma toegang tot bestanden en resources binnen de mappenhiërarchie.
Laten we bekijken hoe je de huidige werkmap benadert met de modules os en pathlib en deze twee oplossingen vergelijken.
Met os.getcwd()
De os-module geeft toegang tot het besturingssysteem van de computer. De functie getcwd() haalt de huidige werkmap op:
De uitvoer toont het pad van de map die het script bevat. De indeling van het pad hangt af van het besturingssysteem. De bovenstaande uitvoer is voor POSIX-besturingssystemen zoals Linux, Unix en macOS.
Op een Windows-systeem zou hetzelfde pad er zo uitzien:
Daarom moeten we stringmethoden en andere bewerkingen op strings gebruiken om met dit pad te werken.
Met pathlib.Path.cwd()
Python 3.4 introduceerde de module pathlib, die een objectgeoriënteerde aanpak biedt voor het benaderen en manipuleren van bestandspaden. De belangrijkste klasse in pathlib is Path, die we kunnen importeren voordat we de huidige werkmap ophalen:
De afgedrukte uitvoer van Path.cwd() lijkt op de waarde die os.getcwd() retourneert. Toch retourneert Path.cwd() geen string. We kunnen dit bevestigen door het type van het geretourneerde object te printen of de officiële stringrepresentatie weer te geven met repr():
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')Mogelijk gemaakt door
Op een Windows-computer retourneert Path.cwd() een WindowsPath-object.
De objecten PosixPath en WindowsPath bieden vergelijkbare functionaliteit om platformonafhankelijke programma's mogelijk te maken. Dit zijn enkele attributen van deze objecten:
Python-programma's moeten vaak met het pad werken, bijvoorbeeld om een bestand in een submap op te slaan. Stel dat we een nieuwe submap in onze huidige werkmap moeten maken en daarin een tekstbestand moeten opslaan.
Met de os-module
De functie getcwd() in de os-module retourneert een string. Daarom is het mogelijk om deze string handmatig aan te passen om het pad te wijzigen. De benodigde aanpassingen verschillen echter per besturingssysteem, omdat verschillende systemen verschillende padindelingen hebben. Een betere optie is om os.path.join() te gebruiken:
import os
cwd = os.getcwd()
output_path = os.path.join(cwd,"testing_os")print(output_path)Mogelijk gemaakt door
Het pad dat os.path.join() retourneert, heeft de juiste indeling voor het gebruikte besturingssysteem. Dit levert een string op met het nieuwe pad. We kunnen controleren of deze submap bestaat met os.path.exists(), dat een booleaan retourneert:
Dit laat zien dat het pad dat door output_path wordt weergegeven, nog niet bestaat. De os-module biedt hulpmiddelen om deze map te maken. De functie os.mkdir() maakt een nieuwe map:
De nieuwe submap bestaat nu, en nieuwe bestanden kunnen in deze map worden opgeslagen:
output_file = os.path.join(output_path,"test.txt")withopen(output_file,"w")asfile:file.write("Testing path modification with the 'os' module")Mogelijk gemaakt door
De variabele output_file bevat de naam van het gewenste uitvoerbestand met het volledige pad. Dit tekstbestand wordt gemaakt in de submap /testing_os binnen de huidige werkmap.
We kunnen ook alle items in een map opvragen met os.listdir():
De functie os.listdir() retourneert een lijst met alle items in de map. Deze code itereert door die lijst om elk bestand of elke map op een aparte regel weer te geven. In dit voorbeeld bevat de map één tekstbestand.
Met de pathlib-module
De nieuwere module pathlib biedt ook hulpmiddelen om nieuwe paden te maken. Deze module gebruikt de slash-operator / om elementen tot één pad te combineren. Dit is dezelfde operator die wordt gebruikt voor deling van numerieke datatypen, maar ook het teken dat in POSIX-besturingssystemen in bestandspaden wordt gebruikt. Laten we een nieuw pad maken en controleren dat het nog niet bestaat:
from pathlib import Path
cwd = Path.cwd()
output_path = cwd /"testing_pathlib"print(output_path)print(Path.exists(output_path))Mogelijk gemaakt door
Zoals met andere tools in pathlib is de geretourneerde waarde geen string. In plaats daarvan is het een PosixPath- of WindowsPath-object. We kunnen het attribuut .name gebruiken om de bestands- of mapnaam zonder het volledige pad weer te geven:
Waar os.listdir() een lijst retourneert, retourneert pathlib.Path.iterdir() een generator-object (je kunt deze tutorial over Python-iterators en -generators lezen als je een opfrisser nodig hebt):
Dit gedrag volgt de best practices in modern Python, omdat iterators en generators in bepaalde situaties efficiënter zijn.
De huidige werkmap (CWD) wijzigen
Het is ook mogelijk om de huidige werkmap direct vanuit een Python-programma te wijzigen met os.chdir(). Omdat dit geen bewerking is die direct met het pad te maken heeft, is er geen alternatief in pathlib. We kunnen echter nog steeds pathlib.Path-objecten als argumenten gebruiken:
import os
from pathlib import Path
cwd = Path.cwd()print(cwd)
os.chdir(cwd.parent)
cwd = Path.cwd()print(cwd)Mogelijk gemaakt door
De werkmap is nu gewijzigd. We kunnen ook cwd.parent.resolve() gebruiken om ervoor te zorgen dat eventuele symbolische links correct worden afgehandeld. Het argument in os.chdir() kan ook een string zijn, zoals de paden die worden geretourneerd door functies in de os-module.
Wees voorzichtig bij het wijzigen van de werkmap binnen een programma om onverwacht gedrag te voorkomen.
Best practices en tips
Hier zijn enkele best practices en tips voor het werken met paden in Python:
Conclusie
Navigeren door en manipuleren van bestandspaden is een veelvoorkomende vereiste in veel Python-programma's. De os-module biedt de traditionele functies om deze taken af te handelen, terwijl de pathlib-module een modernere, objectgeoriënteerde aanpak biedt. Het gebruik van pathlib vereenvoudigt niet alleen veel handelingen, maar zorgt er ook voor dat je code platformonafhankelijk blijft en makkelijker te lezen is.
Of je nu een bestaande codebase onderhoudt die os gebruikt, of een nieuw project start waarin je pathlib kunt inzetten, inzicht in beide modules en hun mogelijkheden geeft je de flexibiliteit en het vertrouwen om paden in elk Python-project te beheren.
Ga verder met je Python-leertraject met deze cursussen:
Ik studeerde natuurkunde en wiskunde op bachelorniveau aan de Universiteit van Malta. Daarna verhuisde ik naar Londen en behaalde ik mijn PhD in natuurkunde aan Imperial College. Ik werkte aan nieuwe optische technieken om het menselijk netvlies in beeld te brengen. Nu richt ik me op schrijven over Python, communiceren over Python en lesgeven in Python.
Veel Python-programma's moeten door het bestandssysteem navigeren om bestanden te lezen en te schrijven. Een veelvoorkomende handeling is het ophalen van de huidige werkmap, vaak afgekort tot CWD.
Python heeft twee hoofdmodules die je kunt gebruiken om toegang te krijgen tot bestandspadnamen: de
os-module en depathlib-module.De
os-module biedt de traditionele aanpak om de huidige werkmap op te vragen en werkt met paden en het bestandssysteem.De
pathlibis een nieuwere module die een objectgeoriënteerde, robuuste en platformonafhankelijke aanpak biedt.In deze tutorial verken ik verschillende technieken om de huidige werkmap op te halen en te bewerken. Wil je meer leren over Python, bekijk dan gerust mijn andere blogposts:
Python: de huidige werkmap (CWD) ophalen
De huidige werkmap is de map waarin een Python-programma wordt uitgevoerd. Dit dient als referentiepunt voor relatieve bestandspaden en geeft het programma toegang tot bestanden en resources binnen de mappenhiërarchie.
Laten we bekijken hoe je de huidige werkmap benadert met de modules
osenpathliben deze twee oplossingen vergelijken.Met
os.getcwd()De
os-module geeft toegang tot het besturingssysteem van de computer. De functiegetcwd()haalt de huidige werkmap op:De uitvoer toont het pad van de map die het script bevat. De indeling van het pad hangt af van het besturingssysteem. De bovenstaande uitvoer is voor POSIX-besturingssystemen zoals Linux, Unix en macOS.
Op een Windows-systeem zou hetzelfde pad er zo uitzien:
De waarde die
os.getcwd()retourneert, is een string:Daarom moeten we stringmethoden en andere bewerkingen op strings gebruiken om met dit pad te werken.
Met
pathlib.Path.cwd()Python 3.4 introduceerde de module
pathlib, die een objectgeoriënteerde aanpak biedt voor het benaderen en manipuleren van bestandspaden. De belangrijkste klasse inpathlibisPath, die we kunnen importeren voordat we de huidige werkmap ophalen:De afgedrukte uitvoer van
Path.cwd()lijkt op de waarde dieos.getcwd()retourneert. Toch retourneertPath.cwd()geen string. We kunnen dit bevestigen door het type van het geretourneerde object te printen of de officiële stringrepresentatie weer te geven metrepr():Op een Windows-computer retourneert
Path.cwd()eenWindowsPath-object.De objecten
PosixPathenWindowsPathbieden vergelijkbare functionaliteit om platformonafhankelijke programma's mogelijk te maken. Dit zijn enkele attributen van deze objecten:Waar mogelijk gaat de voorkeur uit naar de module
pathlib, die moderner is en het werken met paden eenvoudiger maakt. Je kunt deze uitgebreide gids over het gebruik van pathlib in Python lezen als je meer wilt leren.Werken met de huidige map
Python-programma's moeten vaak met het pad werken, bijvoorbeeld om een bestand in een submap op te slaan. Stel dat we een nieuwe submap in onze huidige werkmap moeten maken en daarin een tekstbestand moeten opslaan.
Met de
os-moduleDe functie
getcwd()in deos-module retourneert een string. Daarom is het mogelijk om deze string handmatig aan te passen om het pad te wijzigen. De benodigde aanpassingen verschillen echter per besturingssysteem, omdat verschillende systemen verschillende padindelingen hebben. Een betere optie is omos.path.join()te gebruiken:Het pad dat
os.path.join()retourneert, heeft de juiste indeling voor het gebruikte besturingssysteem. Dit levert een string op met het nieuwe pad. We kunnen controleren of deze submap bestaat metos.path.exists(), dat een booleaan retourneert:Dit laat zien dat het pad dat door
output_pathwordt weergegeven, nog niet bestaat. Deos-module biedt hulpmiddelen om deze map te maken. De functieos.mkdir()maakt een nieuwe map:De nieuwe submap bestaat nu, en nieuwe bestanden kunnen in deze map worden opgeslagen:
De variabele
output_filebevat de naam van het gewenste uitvoerbestand met het volledige pad. Dit tekstbestand wordt gemaakt in de submap/testing_osbinnen de huidige werkmap.We kunnen ook alle items in een map opvragen met
os.listdir():De functie
os.listdir()retourneert een lijst met alle items in de map. Deze code itereert door die lijst om elk bestand of elke map op een aparte regel weer te geven. In dit voorbeeld bevat de map één tekstbestand.Met de
pathlib-moduleDe nieuwere module
pathlibbiedt ook hulpmiddelen om nieuwe paden te maken. Deze module gebruikt de slash-operator/om elementen tot één pad te combineren. Dit is dezelfde operator die wordt gebruikt voor deling van numerieke datatypen, maar ook het teken dat in POSIX-besturingssystemen in bestandspaden wordt gebruikt. Laten we een nieuw pad maken en controleren dat het nog niet bestaat:De klasse
Pathheeft een eigen methode.mkdir()om een nieuwe map te maken:Omdat
output_patheenPosixPath- ofWindowsPath-object is, kunnen we overal de slash-operator gebruiken om een nieuw pad te maken:Het nieuwe tekstbestand wordt gemaakt in de map
/testing_pathlib.We kunnen de methode
Path.iterdir()gebruiken om door elk item in een map te itereren:Zoals met andere tools in
pathlibis de geretourneerde waarde geen string. In plaats daarvan is het eenPosixPath- ofWindowsPath-object. We kunnen het attribuut.namegebruiken om de bestands- of mapnaam zonder het volledige pad weer te geven:Waar
os.listdir()een lijst retourneert, retourneertpathlib.Path.iterdir()eengenerator-object (je kunt deze tutorial over Python-iterators en -generators lezen als je een opfrisser nodig hebt):Dit gedrag volgt de best practices in modern Python, omdat iterators en generators in bepaalde situaties efficiënter zijn.
De huidige werkmap (CWD) wijzigen
Het is ook mogelijk om de huidige werkmap direct vanuit een Python-programma te wijzigen met
os.chdir(). Omdat dit geen bewerking is die direct met het pad te maken heeft, is er geen alternatief inpathlib. We kunnen echter nog steedspathlib.Path-objecten als argumenten gebruiken:De werkmap is nu gewijzigd. We kunnen ook
cwd.parent.resolve()gebruiken om ervoor te zorgen dat eventuele symbolische links correct worden afgehandeld. Het argument inos.chdir()kan ook een string zijn, zoals de paden die worden geretourneerd door functies in deos-module.Wees voorzichtig bij het wijzigen van de werkmap binnen een programma om onverwacht gedrag te voorkomen.
Best practices en tips
Hier zijn enkele best practices en tips voor het werken met paden in Python:
Conclusie
Navigeren door en manipuleren van bestandspaden is een veelvoorkomende vereiste in veel Python-programma's. De
os-module biedt de traditionele functies om deze taken af te handelen, terwijl depathlib-module een modernere, objectgeoriënteerde aanpak biedt. Het gebruik vanpathlibvereenvoudigt niet alleen veel handelingen, maar zorgt er ook voor dat je code platformonafhankelijk blijft en makkelijker te lezen is.Of je nu een bestaande codebase onderhoudt die
osgebruikt, of een nieuw project start waarin jepathlibkunt inzetten, inzicht in beide modules en hun mogelijkheden geeft je de flexibiliteit en het vertrouwen om paden in elk Python-project te beheren.Ga verder met je Python-leertraject met deze cursussen: